The Candid MCP connector routes your AI agent's tool calls to Candid's own MCP server through Scalekit. Each user signs in to Candid once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 6 tools.
- Tools
- 6
- What they doRead · write · destructive
- 6 · 0 · 06 read0 write0 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
What you can do
- Search nonprofits and funders: find nonprofits and grantmaking organizations by name, mission, location, or type of work
- Search sector research: find articles, research reports, and training content about the social and philanthropic sector
- Identify organizations and places: resolve nonprofit names in text to Candid profiles and place names to location IDs
- Classify by subject: tag text with philanthropy subject and population codes from Candid’s taxonomy
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Candid MCP connection
In AgentKit > Connections, create a Candid MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Candid MCP server, so you don't need to register an OAuth app.
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'candidmcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Candid MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'candidmcp_current_date',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "candidmcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Candid MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="candidmcp_current_date",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolcandidmcp_current_dateGet today's date for use in time-sensitive queries and data requests.Read-onlyCurrent Date
Get today's date for use in time-sensitive queries and data requests.
Inputs
This tool takes no inputs.
candidmcp_identify_locationsDetect and resolve geographic names in text to Geonames IDs for use in organization search filters.Read-onlyIdentify Locations
Detect and resolve geographic names in text to Geonames IDs for use in organization search filters.
Inputs
textstringrequired- No description.
candidmcp_identify_mentioned_organizationsResolve nonprofit names mentioned in text to Candid profile URLs.Read-onlyIdentify Mentioned Organizations
Resolve nonprofit names mentioned in text to Candid profile URLs.
Inputs
organizationsarrayrequired- No description.
candidmcp_knowledge_resourcesSearch Candid's knowledge base for articles, blog posts, research reports, and training content about the social and philanthropic sector.Read-onlyKnowledge Resources
Search Candid's knowledge base for articles, blog posts, research reports, and training content about the social and philanthropic sector.
Inputs
querystringrequired- No description.
sourcesarrayrequired- No description.
news_days_agointeger- No description.default
60
candidmcp_search_organizationsSearch Candid's database for nonprofits and grantmaking organizations by name, mission, location, or type of work.Read-onlySearch Organizations
Search Candid's database for nonprofits and grantmaking organizations by name, mission, location, or type of work.
Inputs
querystringrequired- No description.
geonameids_of_geographies_servedstring- No description.
geonameids_of_organization_locationstring- No description.
leader_demographicsstring- No description.
located_admin1string- No description.
located_postal_codestring- No description.
org_seal_statusstring- No description.
populations_served_codesstring- No description.
subject_codesstring- No description.
candidmcp_taxonomy_termsClassify text using Candid's Philanthropy Classification System (PCS) taxonomy to get subject and population codes.Read-onlyTaxonomy Terms
Classify text using Candid's Philanthropy Classification System (PCS) taxonomy to get subject and population codes.
Inputs
textstringrequired- No description.
No tools match.