API KEYS · FEEDBACK

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://map.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-server with 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://map.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://map.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://map.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://map.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.
search_orgs Look up specific organizations by name (substring, case-insensitive) or EIN — the way in when the user names a concrete org ("tell me about City Harvest"). Returns id, name, state, EIN, official NTEE classification, a one-line summary, and a clickable web dossier url per hit; follow up with get_org_preview / get_org_financials / get_org_grants / similar_orgs / benchmark_org using the organization_id. Scoped to the landscape like everything else. For discovering orgs by TOPIC, use browse_activity_groups or show_landscape_position instead.
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 a weighted blend: specificity-weighted activity-group overlap (55% — sharing a niche group counts more than a broad one), revenue-scale proximity (15%), shared named funders (15%), shared populations (15%). Components the subject org lacks data for are dropped and the weights renormalized. 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.
get_org_financials An organization's IRS Form 990 financials: a multi-year filing series (revenue, expenses, assets, revenue mix, employees/volunteers, growth), the latest expense breakdown (program/admin/fundraising ratios) and balance-sheet liquidity, official NTEE classification and filing history, IRS compliance signals (grantmaker flags, political/lobbying activity, compliance tier), public-charity-status tests, and the latest year's Part III program narratives with spend. Use for 'how big is this org / is it growing / how does it spend' — for percentile context against peers use benchmark_org, and for landscape-wide distributions use field_stats.
get_org_people An organization's leadership as filed on Form 990 Part VII: officers, directors, key and highest-compensated employees with titles, hours, and reported compensation (latest tax year), plus board composition (voting members, independence ratio, governance score) and staff/volunteer counts. Use for 'who runs this org / what does the ED make / how independent is the board'.
get_org_grants Actual grant TRANSACTIONS from IRS filings, both directions. RECEIVED: grants to this org found across foundation 990-PF schedules and public-charity Schedule I — counts, dollars, year span, top funders, and recent grants with purposes. MADE: the org as a funder — per-year grantmaking aggregates (count, recipients, total, median), funder profile, top recipients, recent grants. This is filed money with dollars attached — different from research_funders, which reports funder MENTIONS extracted from org materials (claims, not transactions). Received totals are a floor: recipient matching is name-based and misses some grants.
get_org_affiliations Formal related organizations from IRS Schedule R of the org's latest filing: parents, subsidiaries, controlled entities, related tax-exempt orgs and partnerships, with control flags, ownership percentages, and inter-org transaction amounts. This is LEGAL/FINANCIAL structure as filed — complementary to relationship_network, which maps extracted partner mentions from org materials.
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://map.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":{}}'