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://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-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://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":{}}'