Connectors cover the big apps, but your investor spreadsheet or internal tool has none. MCP (Model Context Protocol) is the open standard behind connectors, and it lets you plug in almost anything. Part 1 connects servers other people built. Part 2 builds your own in about 30 lines of Python.
1Understand MCP in one paragraph
An MCP server is a small program that offers Claude a set of tools. The app you talk to (claude.ai, the desktop app, Claude Code) is the host, and it runs one MCP client per server. The MCP docs compare it to a USB-C port: build a server once and any MCP host can use it. A server can offer three kinds of thing:
| Primitive | Who decides to use it | Founder example |
|---|---|---|
| Tools | Claude, during a task | "Find this fund in my CSV", "add a note" |
| Resources | The app, as background | The text of your one-pager |
| Prompts | You, by name | A saved "prep me for this investor call" template |
Servers run in one of two ways. Local servers run on your computer: the host starts them as a child process and talks over stdio. Remote servers live at an HTTPS URL. claude.ai can only use remote ones, because it connects from Anthropic's cloud, not from your laptop.
2Add a remote server on claude.ai
Custom connectors work on every plan, but Free is limited to one. On Team and Enterprise, an Owner adds the server under Organization settings → Connectors, then each member connects with their own account.
- Find the server URL in the provider's docs. It looks like
https://mcp.example.com/mcp. - Go to Customize → Connectors and choose Add custom connector (some layouts put it behind + Add).
- Paste the URL and pick how people sign in. For OAuth, the recommended client option is Claude's published identity.
- Click Add, sign in, and deny any permission the job doesn't need.
- In a chat, open + → Connectors to turn it on or off for that conversation.
- In Customize → Connectors, open the connector and set every tool that writes, sends or deletes to Needs approval or Blocked.
3Add servers in Claude Code and the desktop app
Claude Code adds servers from the terminal. Remote servers use --transport http. For local servers, the launch command goes after --, and everything after it is passed to the server untouched.
claude mcp add --transport http notion https://mcp.notion.com/mcp claude mcp add --env API_KEY=[your-key] --transport stdio my-tool -- npx -y [server-package] claude mcp list claude mcp remove notion
Then run /mcp inside Claude Code to sign in to remote servers and check their status. The --scope flag decides where a server is saved:
| Scope | Loads in | Shared with your team | Saved in |
|---|---|---|---|
local (default) | This project only | No | ~/.claude.json |
project | This project only | Yes, through git | .mcp.json in the project |
user | All your projects | No | ~/.claude.json |
Desktop app: packaged local servers (desktop extensions, .mcpb files) install from Settings → Extensions; you can drag a .mcpb file onto that page. For any other local server, open Settings from the Claude menu in your system menu bar, then Developer → Edit Config. Add the server under mcpServers in claude_desktop_config.json, then fully quit and reopen the app. Closing the window isn't enough. On macOS or WSL, claude mcp add-from-claude-desktop copies those servers into Claude Code.
4Build a server with the official Python SDK
Now your own: investor-notes, with one tool that finds a fund in your CSV and one that appends a dated note. The official Python SDK is on PyPI as mcp (version 2 as of October 2026, Python 3.10 or later). Install uv, then run uv init investor-notes, cd investor-notes and uv add "mcp[cli]". Save your investor list there as investors.csv (keep the fund and partner columns), and server.py next to it:
fund,partner,stage,check_size,status Example Ventures,Dana Lee,Seed,$250k-$1M,Intro requested Sample Capital,Sam Ortiz,Pre-seed,$100k-$500k,Not contacted
import csv
from datetime import date
from pathlib import Path
from mcp.server import MCPServer
from mcp.types import ToolAnnotations
HERE = Path(__file__).parent
INVESTORS = HERE / "investors.csv"
NOTES = HERE / "notes.md"
mcp = MCPServer("investor-notes")
@mcp.tool(annotations=ToolAnnotations(read_only_hint=True, open_world_hint=False))
def find_investor(name: str) -> list[dict[str, str]]:
"""Find rows in my investor CSV where the fund or partner name contains this text."""
with INVESTORS.open(newline="") as f:
rows = list(csv.DictReader(f))
q = name.lower()
return [r for r in rows if q in r["fund"].lower() or q in r["partner"].lower()]
@mcp.tool(annotations=ToolAnnotations(read_only_hint=False, destructive_hint=False))
def add_note(fund: str, note: str) -> str:
"""Append a dated note about a fund to notes.md. Never edits or deletes old notes."""
with NOTES.open("a") as f:
f.write(f"- {date.today().isoformat()} | {fund} | {note}\n")
return f"Saved a note for {fund}."
if __name__ == "__main__":
mcp.run()Function names become tool names, docstrings become the descriptions Claude reads, and type hints become the input form. mcp.run() starts a stdio server. The annotations tell hosts that one tool only reads and the other doesn't delete, but they're hints, not security. The real limit is the code: it opens one CSV and only appends to notes.md. Prefer TypeScript? The v2 TypeScript SDK installs with npm install @modelcontextprotocol/server.
5Test it in the MCP Inspector
The MCP Inspector is the official way to try a server before Claude touches it. It needs Node.js 22.19 or later.
uv run mcp dev server.py
It prints a local address on port 6274 with an access token. Open it, connect, go to Tools, and call find_investor with dana. You should get the Example Ventures row. Call add_note and check that notes.md gained one line. The Inspector also has a terminal mode (npx @modelcontextprotocol/inspector --cli) for scripted checks. If it won't connect, look for print() calls. On stdio, stdout carries the protocol, so stray output breaks the connection. Log with Python's logging, which writes to stderr.
6Connect it to Claude Code
Register it with an absolute path, because Claude Code starts the server from its own working directory:
claude mcp add investor-notes -- uv run --with "mcp[cli]" mcp run /absolute/path/to/server.py
Run /mcp to confirm it's connected, then ask: "Who's the partner at Example Ventures? Log that I emailed her today." In Manual permission mode, Claude Code asks before each tool call. For the desktop app, run uv run mcp install server.py in the project folder: it writes the config entry for you. Then fully quit and reopen the app. If a host can't find uv, use the full path that which uv prints.
Build me a local MCP server with the official MCP Python SDK, version 2 (from mcp.server import MCPServer). Data: [file or API, e.g. pipeline.csv with columns company, stage, owner, next_step]. Tools: [1 to 3, e.g. find a deal by company name; append a dated note]. Rules: read only that one file, writes may only append, no network calls, never print to stdout, and mark read-only tools with ToolAnnotations(read_only_hint=True). Test every tool with the MCP Inspector CLI and show me the output. Then give me the claude mcp add command with the absolute path. Don't run that command yourself.
7Lock it down
Want your server on claude.ai or shared with your team? It has to run at a public HTTPS URL with sign-in. The SDK can serve it with mcp run server.py --transport streamable-http, but hosting it safely is its own project.
What's next
Use these tools inside your own code with Build an agent with the Agent SDK, or put an agent on an always-on machine with Run an agent on a server. Fill the CSV first with Build a 50-investor list, and compare with the ready-made connectors.