MCP server
The full intelligence layer — taxonomy search, org research, observation data, and your workspace — as a Model Context Protocol server, so you can interrogate the data from Claude, Cursor, or any MCP client.
Endpoint
https://ny.northstartoolkit.com/api/mcp Streamable HTTP transport, stateless. Two auth options:
- OAuth (recommended for end users): add the endpoint as a custom
connector in Claude (or any MCP client that supports OAuth) and it will walk you
through sign-in + authorization — no key required. Discovery is served at
/.well-known/oauth-authorization-serverwith dynamic client registration. The plain-language walkthrough lives at /connect. - API key (for scripts and headless clients): the same
API key as the REST API, sent as
Authorization: Bearer <key>— used in the configs below.
Claude setup
Claude Code:
claude mcp add --transport http impact-map https://ny.northstartoolkit.com/api/mcp \
--header "Authorization: Bearer YOUR_API_KEY" Claude Desktop / other JSON-config clients — add to
mcpServers:
{
"mcpServers": {
"impact-map": {
"type": "http",
"url": "https://ny.northstartoolkit.com/api/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
} Cursor setup
Add to .cursor/mcp.json (project) or ~/.cursor/mcp.json (global):
{
"mcpServers": {
"impact-map": {
"url": "https://ny.northstartoolkit.com/api/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
} Interactive cards (experimental, opt-in)
Tool results are data-only by default: a structured JSON text block with denominators,
caveats, and chart-ready series for the model to reason over. Entity tools (org previews,
activity groups, list/note confirmations) can additionally return an
MCP-UI card that MCP-Apps-capable hosts render inline —
that layer is still stabilizing, so it is off unless you configure the endpoint as
https://ny.northstartoolkit.com/api/mcp?ui=cards.
Try these prompts
- “Map the youth-development landscape and save the 5 largest orgs to a list called ‘prospects’.”
- “Who funds food-security work here, and how concentrated is that funding? Add a note on the most-cited funder.”
- “Compare the housing and workforce-development activity groups — which strategies do they share, and where do they concentrate geographically?”
- “Chart the revenue distribution of this landscape (field_stats), then benchmark the largest org against its national NTEE/size peer class (benchmark_org).”
- “Which entities bridge the housing and health fields (relationship_network brokers), and is the housing field growing (field_trends cohort)?”
Available tools
| Tool | Description |
|---|---|
list_landscapes | List every landscape visible to this user (a named set of organizations) with org counts and taxonomy summaries. Call this first — every other warehouse tool scopes to a landscape slug from here. |
browse_activity_groups | DEFAULT WAY to explore a landscape: navigate the activity taxonomy top-down like a human would. Call with no parent_id to see the broad sectors (level 2), then drill down by passing any group's stable_id as parent_id to open its children. Every node carries a description, child_count, activity_count, and org_count so you can decide where to go next, and the response includes a breadcrumb back to the sector. Level-0 groups are leaves — from there use describe_activity_group or list_orgs_in_activity_group. Prefer this browse-then-drill workflow for orientation, coverage, and most research; use show_landscape_position only when the user names a concrete topic to locate. |
search_activity_groups | Hybrid (keyword + semantic) search over the activity-group taxonomy. Use whenever the user mentions a topic, cause area, or activity. Returns up to 10 groups with label, level (0=specific, 2=broadest), member_count (ACTIVITIES, not orgs), stable_id, and — for semantic hits — a similarity score (0-1). This is a ranked nearest-neighbor search: it always returns the closest groups it can find, so check similarity before trusting weak trailing matches. |
list_landscape_attributes | List this landscape's org ATTRIBUTES (classifier verdicts like scope of activity, denomination, Jewish affiliation) with per-value org counts. Call before list_orgs_by_attribute to discover valid keys/values; returns empty when the landscape defines no attributes. Attributes are defined per LANDSCAPE and are independent of the activity taxonomy, so this tool takes no `taxonomy` input and the counts are the same under every published taxonomy. Counts cover orgs with at least one indexed activity (orgs that dropped out before extraction are excluded). |
list_orgs_by_attribute | List organizations holding a specific attribute value (e.g. scope=israel_focused, denomination=orthodox), largest first with classifier confidence. Keys/values come from list_landscape_attributes. Attributes are landscape-level classifier verdicts, independent of the activity taxonomy — this tool takes no `taxonomy` input and returns the same orgs under every published taxonomy. |
list_orgs_by_main_cause | List organizations whose derived MAIN CAUSE sits at a given activity group — what they PREDOMINANTLY do, not merely something they touch (list_orgs_in_activity_group includes every org with any activity there; this filters to the ones anchored there). Sector-level (level 2) groups match primary causes; area-level (level 1) groups match secondary causes. LEVEL-0 IDS ARE PROMOTED: causes are only derived down to the activity-area level, so passing a level-0 program-type id answers about its PARENT activity area instead. When that happens the returned group_label, group_level, total and orgs all describe the PARENT group, not the id you asked about — always quote group_label (and resolved_group_id when present) rather than assuming the answer is about your requested group, and expect a substantially larger total. Each org carries its one-line cause statement. Empty until derive-causes has run for the active taxonomy. |
list_activity_groups | Page through the landscape's ENTIRE activity taxonomy as a flat list — no search query needed. Returns stable_id, label, level + level_label (sector / activity_area / program_type), parent_stable_id, activity_count (indexed activities in the subtree), and org_count (distinct landscape orgs) per group, ordered by level then size. Use for systematic sweeps and full-coverage audits; for exploration and drill-down, browse_activity_groups is the better fit. |
show_landscape_position | BEST FIRST MOVE when the user names a CONCRETE TOPIC (e.g. "housing stability"): returns matching activity groups enriched with descriptions, per-group top orgs, org_count (distinct landscape orgs — quote this for org counts; member_count is activities), similarity scores on semantic matches, sector rollups, and neighborhood size. top_state reports the most common state with its share; only treat it as a geographic story when dominant=true. Curate which matches are on-topic before drilling in. For open-ended exploration without a topic phrase, start with browse_activity_groups instead. |
describe_activity_groups | Walkthrough-ready summaries of 2-6 activity groups: description, keywords, activity + org counts, top orgs each. Ids that do not resolve in this landscape are reported in unresolved_group_ids rather than silently dropped. |
describe_activity_group | Rich detail for a single activity group: description, keywords, top orgs, top states, top strategies, plus member_count (indexed ACTIVITIES in the subtree) and org_count (distinct landscape orgs — the number to quote for "how many nonprofits"). Call before recommending orgs inside a group. |
list_orgs_in_activity_group | Organizations in an activity group's subtree ranked by activity count, with pagination. |
get_org_preview | Snapshot of one organization WITH PROVENANCE: name, state, AI summary, activity counts, and every activity's origin + evidence sources. Read the provenance before quoting an org as evidence of anything. `origin` is 'extracted' (the normal pipeline over crawled website / 990 text) or 'inserted:<recipe>' (written deterministically from structured records — e.g. 'inserted:bmf-congregations-v1' = a congregation identified from IRS registration data and counted but never individually researched; 'inserted:zero_activity_fallback' = one cautious inference from limited metadata). Inserted rows carry NO evidence sources and must not be described as observed behaviour. `profile_basis` says which source text reached the profile prompt: [website,irs_990] = full, [irs_990] = no usable website (profiled from filings), [registry] = registry identity only, null = pre-v1.8.0 legacy profile (treat as full). `has_990n` = brought in via a 990-N e-postcard match (gross receipts under $50k), so no full-990 financials exist for it. COUNTS, three of them, do not mix them up: `activity_count` is the processing ledger's consolidated-extraction counter — it is NOT landscape-scoped and it does NOT include inserted activities, so it reads 0 for an org whose only activity was inserted (it is lower than the true total for 7,556 of the 12,608 orgs in the Jewish landscape); it is kept unchanged for backward compatibility, do not quote it as 'how many activities this org has'. `activity_count_total` is every activity row on record for the org (all origins, not landscape-scoped). `activity_count_in_taxonomy` counts only the activities placed in the resolved landscape's activity taxonomy — that is the number consistent with the activity-group tools, and the one to quote when talking about this landscape. Pass `landscape`/`taxonomy` to resolve against a specific landscape; omitted, the default landscape is used. `activities` is capped at `activity_limit` (any surplus is reported as `activities_omitted`); `activities_by_origin` and the counts always cover ALL of them. For 990 financials, populations, funders, relationships and peers, use the REST API /api/v1/orgs/:id. |
compare_activity_groups | Side-by-side comparison of 2-6 activity groups: each with activity + org counts, top orgs, dominant states, top strategies. Errors if fewer than 2 of the requested ids resolve; any other unresolved ids are reported in unresolved_group_ids. |
geographic_breakdown | State-by-state org distribution across one or more activity groups. Returns the top `limit` states (default 10) plus an other_states rollup and unknown_state_orgs, so the long tail is quantified. total_orgs here counts distinct landscape orgs — the same definition as org_count elsewhere. Unresolved ids are reported in unresolved_group_ids. |
research_strategies | Named approaches used by orgs in a topic scope (e.g. 'housing-first model'), with org counts and sample orgs. Use for questions about strategies, approaches, models, or 'how' orgs work. |
research_funders | Funders explicitly named by orgs in a topic scope, with a concentration signal (concentrated/moderate/diffuse). |
research_populations | Populations served by orgs in a topic scope, with sample geographies. Use for who-is-served and gap questions. |
research_relationships | Named partners and coalitions orgs publicly claim — a real network layer, not inferred. |
research_activity_mix | Coarse activity-type mix (five canonical types plus untyped pipeline misses) for a topic scope. Shares use all activities as the denominator. For named strategies use research_strategies instead. |
list_strategy_groups | Page through the landscape's STRATEGY taxonomy — the flat 'theories of action' layer (e.g. 'housing-first model'), distinct from the activity taxonomy every other group tool uses. Returns each strategy's name, description, and distinct-org adoption count in this landscape, ordered by adoption. Use research_strategies instead when you want strategies WITHIN an activity topic. This layer has its OWN taxonomy (reported as strategy_taxonomy_id), so there is no `taxonomy` input here — the activity-taxonomy pin does not apply to strategies. |
field_stats | Distribution of a 990 metric (revenue, expenses, reserves, growth, staff, revenue-mix shares…) across a scope: n, quartiles, p90, mean, total, top-5 share, and HHI concentration. Group by state, sector, or the provided activity groups. THE workhorse for "how big / how concentrated / what is typical" questions. Results include denominators and caveats — cite them. |
correlate_metrics | Spearman + Pearson correlation between two 990 metrics across orgs in a scope, plus decile buckets of x with median y (a scatter sketch). Descriptive, not causal — the result says so. Use for "do bigger orgs have better reserves?"-style questions. |
benchmark_org | Place one org against (a) landscape peers sharing its activity groups and (b) the national IRS universe in its NTEE category and size band. Returns the org value, peer/national medians, and percentile ranks for revenue, expenses, margin, reserves, growth, staffing, and revenue-mix shares. Use for "is this org's overhead/reserves/growth normal?". |
field_trends | Multi-year trajectory of a metric (total_revenue, total_expenses, net_assets, employee_count, volunteer_count) for a scope. Returns an all-filers series AND a constant same-org cohort series with total growth — use the cohort for growth claims (the all-filers series mixes different org sets per year). |
funding_analysis | Funding structure of a scope: funding-type mix (foundation / government / individual / earned / corporate), most-named funders (normalized, with name-variant counts), a mention-based concentration index, and 990 revenue-mix medians (contributions vs program share, count of heavily contributions-dependent orgs). Mentions are claims from org materials — dollar-level dependency claims should use the 990 revenue-mix block. |
relationship_network | Network reads over orgs' publicly claimed relationships. Modes: central_entities (most-cited partners/funders in a scope), ego (one org's named ties + who names it back), shared_partners (intersection of two orgs' networks), brokers (entities bridging two activity-group selections). Names are normalized free text — treat as claims, not verified ties. |
similar_orgs | Most-similar orgs to a given org by weighted overlap: 60% shared activity groups, 20% shared named funders, 20% shared populations served. Each result shows WHAT is shared, so the similarity is explainable. Use for "who else is like this org", peer discovery, or potential partners/duplicates. |
list_my_lists | The caller's saved lists with item counts. |
create_list | Create a new list (shortlist/collection) owned by the caller. |
add_to_list | Add an org or activity group to a list, with an optional note. Provide list_id (from list_my_lists / create_list) OR list_name — an existing list with that name is reused, otherwise it is created. |
remove_from_list | Remove an org or activity group from a list by target id. |
add_note | Save a standalone note on an org, activity group, or strategy (by strategy name). |
list_notes | The caller's notes, optionally filtered by target. |
Verify with curl
The endpoint speaks JSON-RPC over Streamable HTTP — you can smoke-test it directly:
curl -X POST https://ny.northstartoolkit.com/api/mcp \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'