A community-driven registry for Claude, Cursor, Windsurf, Cline & more. Not affiliated with Anthropic.
Are you the author? Sign in to claim
Open-source Python library for 73 API connectors — Gmail, Slack, GitHub, Stripe, OpenAI, Anthropic & more. MCP server, O
One interface, every tool. Connect 68+ APIs to your Python app or AI agent in minutes.
Every SaaS API has its own SDK, its own auth dance, its own pagination scheme, and its own error format. If you're building an AI agent, you also need to generate JSON Schema for function calling -- differently for OpenAI, Anthropic, and Gemini. You end up writing glue code instead of product code.
ToolsConnector gives you a single, typed Python interface to 73 connectors and 1,519 actions. It works identically whether you're building a Django app, an OpenAI agent, or an MCP server for Claude Desktop.
To browse the full connector reference, playground, and guides locally:
python3 -m http.server 5001 --directory site
Then open http://localhost:5001 in your browser.
pip install toolsconnector
Install only the connectors you need:
pip install "toolsconnector[gmail,slack,github]"
Or install a full category:
pip install "toolsconnector[communication,databases,mcp]"
from toolsconnector.serve import ToolKit
kit = ToolKit(
["gmail", "slack"],
credentials={"gmail": "ya29.access-token", "slack": "xoxb-bot-token"},
)
# List unread emails
result = kit.execute("gmail_list_emails", {"query": "is:unread", "max_results": 5})
# Send a Slack message
kit.execute("slack_send_message", {"channel": "#general", "text": "Deployed v2.1"})
That's it. Same ToolKit, same .execute(), every connector.
Want to see real integrations end-to-end? examples/ has 10 copy-pasteable scripts covering every major usage pattern. Pick one closest to what you want to build:
| Pattern | Script |
|---|---|
| 5-minute intro: ToolKit + execute | 01_basic_usage.py |
| One-line MCP server for Claude Desktop / Cursor | 02_mcp_server.py |
| OpenAI function-calling agent (full tool-use loop) | 03_openai_function_calling.py |
| Anthropic Claude tool-use agent | 04_anthropic_tool_use.py |
| Multi-connector agent with safety filtering | 05_multi_connector.py |
tc CLI walkthrough | 06_cli_usage.sh |
| Multi-tenant ToolKitFactory (per-user isolation) | 07_multi_tenant.py |
| Expose connectors as REST API (Starlette + uvicorn) | 08_rest_api.py |
| CI health checks, spec extraction, OpenAPI export | 09_health_check.py |
| Publish to LinkedIn end-to-end | 10_linkedin_publish.py |
See examples/README.md for the full table with required env vars.
await kit.aexecute() and kit.execute() pathspydantic, httpx, and docstring-parserUse connectors directly in any Python application.
from toolsconnector.serve import ToolKit
kit = ToolKit(["github"], credentials={"github": "ghp_your_token"})
# List open issues
issues = kit.execute("github_list_issues", {
"owner": "myorg",
"repo": "myproject",
"state": "open",
})
Expose connectors to Claude Desktop, Cursor, Windsurf, or any MCP client.
from toolsconnector.serve import ToolKit
kit = ToolKit(
["gmail", "gcalendar", "notion"],
credentials={"gmail": "ya29.token", "gcalendar": "ya29.token", "notion": "ntn_key"},
)
kit.serve_mcp() # stdio transport, ready for Claude Desktop
Or from the command line:
# Stdio (one client per process — Claude Desktop launches it as subprocess)
tc serve mcp gmail gcalendar notion --transport stdio
# Long-lived HTTP daemon — multiple agents share one process
tc serve mcp gmail slack github --transport streamable-http --port 9000
The HTTP transport (streamable-http) accepts many concurrent client
sessions on the same port — one daemon serves N agents. Per-tool
circuit breakers and timeout budgets apply fairly across all clients.
There's no built-in auth on the HTTP transport; put it behind a reverse
proxy before exposing it publicly.
Generate tool schemas and execute tool calls from OpenAI responses.
from openai import OpenAI
from toolsconnector.serve import ToolKit
client = OpenAI()
kit = ToolKit(["gmail", "slack"], credentials={...})
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Summarize my unread emails"}],
tools=kit.to_openai_tools(),
)
# Execute the tool call the model chose
tool_call = response.choices[0].message.tool_calls[0]
result = kit.execute(tool_call.function.name, tool_call.function.arguments)
Works the same way with Claude's tool use API.
import anthropic
from toolsconnector.serve import ToolKit
client = anthropic.Anthropic()
kit = ToolKit(["jira", "slack"], credentials={...})
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{"role": "user", "content": "Create a bug ticket for the login issue"}],
tools=kit.to_anthropic_tools(),
)
# Execute the tool call
for block in response.content:
if block.type == "tool_use":
result = kit.execute(block.name, block.input)
Generate Gemini-compatible function declarations.
from toolsconnector.serve import ToolKit
kit = ToolKit(["gmail"], credentials={...})
declarations = kit.to_gemini_tools()
# Pass to google.generativeai as function_declarations
Manage connectors and execute actions from the terminal.
# List all available connectors
tc list
# List actions for a specific connector
tc gmail actions
# Execute an action
tc gmail list_emails --query "is:unread" --max_results 5
# Export the connector spec
tc gmail spec --format json
Serve connectors as HTTP endpoints with Starlette/ASGI.
from toolsconnector.serve import ToolKit
kit = ToolKit(["stripe", "hubspot"], credentials={...})
app = kit.create_rest_app(prefix="/api/v1")
# Run with uvicorn: uvicorn myapp:app --port 8000
# POST /api/v1/stripe/create_charge {"amount": 5000, "currency": "usd"}
Every connector raises typed exceptions from toolsconnector.errors so
your code can branch on the failure mode instead of parsing HTTP status
codes:
from toolsconnector.errors import (
InvalidCredentialsError, TokenExpiredError, PermissionDeniedError,
NotFoundError, RateLimitError, ValidationError, ServerError,
)
try:
await kit.aexecute("gmail_send_email", {...})
except TokenExpiredError:
await refresh_oauth_token()
# ...retry...
except RateLimitError as e:
await asyncio.sleep(e.retry_after_seconds) # parsed from Retry-After header
# ...retry...
except InvalidCredentialsError:
prompt_user_to_reauthenticate()
except NotFoundError:
return None # 404 — caller decides what "missing" means
except PermissionDeniedError:
request_additional_oauth_scopes()
except ValidationError:
# 400 / 422 — your arguments were rejected by the upstream API
raise
except ServerError:
# 5xx — upstream is having a bad day; retry-eligible
pass
All typed errors carry connector, action, upstream_status, and a
truncated details["body_preview"] — useful for logs and observability.
The full taxonomy lives in src/toolsconnector/errors/ if you want to
match more granular cases (e.g. ConflictError for 409).
73 connectors, 1,519 actions across 20 categories.
| Connector | Install Extra | Actions |
|---|---|---|
| Gmail | gmail | 38 |
| Slack | slack | 51 |
| Discord | discord | 25 |
| Microsoft Outlook | outlook | 23 |
| Microsoft Teams | teams | 17 |
| Twilio | twilio | 20 |
| Telegram | telegram | 26 |
| Connector | Install Extra | Actions |
|---|---|---|
| Jira | jira | 28 |
| Asana | asana | 38 |
| Linear | linear | 19 |
| Trello | trello | 25 |
| Connector | Install Extra | Actions |
|---|---|---|
| HubSpot | hubspot | 19 |
| Salesforce | salesforce | 21 |
| Zendesk | zendesk | 16 |
| Freshdesk | freshdesk | 23 |
| Intercom | intercom | 16 |
| Connector | Install Extra | Actions |
|---|---|---|
| GitHub | github | 37 |
| GitLab | gitlab | 21 |
| Connector | Install Extra | Actions |
|---|---|---|
| Notion | notion | 24 |
| Confluence | confluence | 25 |
| Connector | Install Extra | Actions |
|---|---|---|
| Google Drive | gdrive | 22 |
| AWS S3 | s3 | 20 |
| Connector | Install Extra | Actions |
|---|---|---|
| Airtable | airtable | 26 |
| Firebase Firestore | firestore | 17 |
| MongoDB Atlas | mongodb | 16 |
| Redis (Upstash) | redis | 18 |
| Supabase | supabase | 16 |
| Connector | Install Extra | Actions |
|---|---|---|
| Cloudflare | cloudflare | 23 |
| Datadog | datadog | 22 |
| Docker Hub | dockerhub | 14 |
| PagerDuty | pagerduty | 16 |
| Vercel | vercel | 16 |
| Connector | Install Extra | Actions |
|---|---|---|
| Stripe | stripe | 40 |
| Plaid | plaid | 17 |
| Connector | Install Extra | Actions |
|---|---|---|
| Mailchimp | mailchimp | 23 |
| SendGrid | sendgrid | 20 |
| Connector | Install Extra | Actions |
|---|---|---|
| OpenAI | openai | 26 |
| Anthropic | anthropic | 14 |
| Pinecone | pinecone | 15 |
| Connector | Install Extra | Actions |
|---|---|---|
| Mixpanel | mixpanel | 14 |
| Segment | segment | 14 |
| Connector | Install Extra | Actions |
|---|---|---|
| AWS SQS | sqs | 16 |
| RabbitMQ | rabbitmq | 21 |
| Connector | Install Extra | Actions |
|---|---|---|
| Okta | okta | 21 |
| Auth0 | auth0 | 27 |
| Connector | Install Extra | Actions |
|---|---|---|
| Google Calendar | gcalendar | 20 |
| Google Docs | gdocs | 5 |
| Google Sheets | gsheets | 16 |
| Google Tasks | gtasks | 13 |
| Calendly | calendly | 20 |
| Figma | figma | 22 |
| Connector | Install Extra | Actions |
|---|---|---|
| Shopify | shopify | 27 |
| Connector | Install Extra | Actions |
|---|---|---|
| Webhook | webhook | 12 |
ToolsConnector is structured as four layers, each with a single responsibility:
+------------------------------------------------------------------+
| Serve Layer ToolKit, MCP, REST, CLI, Schema Generation |
+------------------------------------------------------------------+
| Runtime Engine BaseConnector, @action, Middleware, Auth |
+------------------------------------------------------------------+
| Connectors Gmail, Slack, GitHub, Stripe, ... (68) |
+------------------------------------------------------------------+
| Spec Types Pydantic V2 models, JSON Schema, Contracts |
+------------------------------------------------------------------+
Spec -- Pure Pydantic V2 models defining the language-agnostic connector contract. No implementation logic. These drive schema generation, MCP serving, documentation, and code generation.
Runtime -- The execution engine. BaseConnector is the abstract base class. The @action decorator parses type hints and docstrings to generate JSON Schema automatically. Middleware handles retry, rate limiting, auth refresh, and structured logging.
Connectors -- 68 implementations, each following the same pattern: subclass BaseConnector, set metadata, implement @action methods. Most use raw httpx for direct HTTP calls. Google and AWS connectors use official SDKs where protocol complexity justifies it.
Serve -- The ToolKit ties everything together. Configure once with a list of connectors and credentials, then serve as MCP, generate OpenAI/Anthropic/Gemini schemas, expose as REST, or call directly from Python.
Every connector follows the same structure:
from toolsconnector.runtime import BaseConnector, action
from toolsconnector.spec.connector import ConnectorCategory, ProtocolType
class MyService(BaseConnector):
name = "myservice"
display_name = "My Service"
category = ConnectorCategory.COMMUNICATION
protocol = ProtocolType.REST
base_url = "https://api.myservice.com/v1"
@action(description="List all items", idempotent=True)
async def list_items(self, limit: int = 20) -> list[dict]:
"""List items from the service.
Args:
limit: Maximum number of items to return.
"""
resp = await self._request("GET", "/items", params={"limit": limit})
return resp.json()["items"]
The @action decorator handles everything: it parses the type hints and docstring to generate JSON Schema, creates a sync wrapper, and registers the method for discovery by ToolKit.
src/toolsconnector/connectors/yourservice/BaseConnector and implement @action methodstypes.py module using Pydantic V2 modelspyproject.tomltests/connectors/yourservice/See the existing connectors (e.g., src/toolsconnector/connectors/slack/) for reference implementations.
pydantic>=2.0, httpx>=0.25, docstring-parser>=0.15gmail extra installs google-api-python-client)Apache License 2.0. See LICENSE for details.
MCP server integration for DaVinci Resolve Studio
mcp-language-server gives MCP enabled clients access semantic tools like get definition, references, rename, and diagnos
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots