mcpField
M
MCP-Excel

MCP-Excel

Local
nife.ioBusiness & Marketing0Updated 4d ago

About MCP-Excel

MCP-Excel is a stateless MCP server that uses Google Sheets as a four-entity CRM for teams and applications managing leads, organizations, contacts, and activities. It supports HTTP and stdio transports and adapts existing sheets by adding missing tabs and columns.

Key features

  1. 01Manage leads, organizations, contacts, and activities
  2. 02Add, search, list, update, and soft-delete records
  3. 03Filter records and follow related records
  4. 04Analyze lead pipelines
  5. 05Resolve and merge duplicate headers
  6. 06Extract contact fields from business-card images

Use cases

  1. 01Track sales leads and their activities in Google Sheets
  2. 02Look up contacts associated with an organization
  3. 03Review pipeline totals by status or segment
  4. 04Extract contact details from a business-card image

MCP support

Exposes CRM operations to MCP clients over streamable HTTP or stdio. Each tool call specifies a Google Sheet ID or URL, with no shared active-sheet state.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

No install method listed yet

We haven’t collected a package or remote endpoint for this server. Follow the instructions in the project README.

Repository

Tools

No tool list yet

Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.

Details

From the project README

MCP-Excel — Google Sheets CRM MCP Server

A stateless MCP server that turns any Google Sheet into a 4-entity CRM (Lead, Organization, Contact, Activity). Runs as a standalone HTTP service (FastMCP streamable-HTTP, default port 5002) or over stdio for Claude Desktop and other local MCP hosts — no gateway, no ngrok, no subprocess spawning required.


Architecture

Any MCP host (Claude Desktop, your backend, an agent framework)
  │  HTTP POST /mcp  (JSON-RPC) — or stdio
  ▼
MCP-Excel :5002  (FastMCP streamable-HTTP)
  │  gspread
  ▼
Google Sheets API

Every tool call includes an explicit sheet_id — there is no session state, no "active sheet" variable. Multiple teams can use the same running instance safely because nothing is shared between requests.


Sheet schema (auto-managed)

Four tabs, created on first connection if they don't exist. Existing tabs are used as-is; missing columns are appended without disturbing existing data.

TabPrimary KeyKey columns
LeadLead IDOrganization ID, Status, Segment, Opportunity Details, Last Contact Date
OrganizationOrganization IDOrganization Name, Industry Domain, Sub Domain, Company Type, Website
ContactContact IDFirst Name, Last Name, Organization ID, Designation, Mobile, Email, LinkedIn Profile
ActivityActivity IDLead ID, Organization ID, Contact ID, Activity Type, Activity Sub-Type, Subject, Discussion Summary, Outcome

IDs auto-increment continuing the existing pattern (LD001 → LD002, ACT010 → ACT011). Falls back to UUID if no consistent pattern is found.

Each tab also gets Created At, Updated At, Deleted audit columns appended if they aren't already present.

Headers are matched fuzzily (synonyms and near-duplicates are resolved), so an existing sheet with slightly different column names still works. Run tool_dedupe_headers (dry-run first) to merge genuine duplicate columns.


Setup

1. Google service account

You need a creds.json service account key with Google Sheets API and Google Drive API enabled.

Place it in this directory (the default path) or set GOOGLE_APPLICATION_CREDENTIALS to its full path.

Never commit creds.json to git. It is excluded in .gitignore; keep it local or mount it as a secret.

2. Share the sheet

For each Google Sheet you want to connect: open the sheet → Share → add the service account email as Editor → Done.

The service account email is printed at startup and returned by get_sheet_info on permission errors. It is also readable from creds.json:

python3 -c "import json; print(json.load(open('creds.json'))['client_email'])"
3. Install dependencies
pip install -r requirements.txt

Optional — business-card OCR (Claude Vision) support:

pip install anthropic
export ANTHROPIC_API_KEY=...

Running

Local dev (HTTP on :5002)
GOOGLE_APPLICATION_CREDENTIALS=creds.json python mcp_excel_server.py

Verify it's healthy:

curl -s -X POST http://localhost:5002/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
  | python3 -m json.tool
Docker (staging / production)
docker build -t mcp-excel .
docker run -p 5002:5002 \
  -v /path/to/creds.json:/secrets/creds.json \
  -e GOOGLE_APPLICATION_CREDENTIALS=/secrets/creds.json \
  mcp-excel
Claude Desktop (stdio transport)

Set MCP_TRANSPORT=stdio to use stdio instead of HTTP:

{
  "mcpServers": {
    "crm": {
      "command": "python",
      "args": ["/path/to/mcp-excel/mcp_excel_server.py"],
      "env": {
        "GOOGLE_APPLICATION_CREDENTIALS": "/path/to/mcp-excel/creds.json",
        "MCP_TRANSPORT": "stdio"
      }
    }
  }
}

Environment variables

VariableDefaultNotes
GOOGLE_APPLICATION_CREDENTIALScreds.jsonPath to service account JSON
MCP_TRANSPORThttphttp for server mode, stdio for Claude Desktop
MCP_PORT5002HTTP listen port
ANTHROPIC_API_KEY—Only for tool_extract_business_card

Tools

All tools are stateless — every call requires sheet_id (full Google Sheets URL or bare spreadsheet ID).

ToolDescription
tool_get_sheet_infoValidate access, ensure all 4 tabs exist, confirm write access
tool_add_recordAdd a record to Lead / Organization / Contact / Activity
tool_list_recordsList records with optional column-based filters (paged)
tool_search_recordsKeyword search across all columns
tool_update_recordUpdate fields on an existing record by primary-key ID
tool_delete_recordSoft-delete a record (sets Deleted to true)
tool_get_related_recordsLook up records via foreign key (e.g. all Activities for a Lead)
tool_get_pipeline_analyticsLead pipeline analytics: total, status breakdown, segment breakdown
tool_dedupe_headersFind and merge duplicate columns (dry-run report first)
tool_extract_business_cardExtract contact fields from a business-card image via Claude Vision (needs ANTHROPIC_API_KEY)

Development

pip install pytest
pytest test_mcp_excel.py test_crm_local.py -v

Tests run fully offline (Google calls are mocked); no credentials needed.


Troubleshooting

ProblemFix
status: failure, message: ""Sheet not found — share it with the service account as Editor
Permission denied on sheetRe-share with the service account as Editor (not Viewer)
Cannot connect to MCP-Excel serviceMCP-Excel not running — start it on :5002
sheet_id is required and was emptyAlways pass sheet_id — there is no implicit active sheet
Tab not found / wrong columnsget_sheet_info auto-creates missing tabs and appends missing columns

License

MIT — see LICENSE. Built by Nife.

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.