Ops MCP Server (Finamatik)

Ten typed, audited tools over contacts, deals, tasks, notes, inventory and sales orders for Claude Desktop, Claude Code or any MCP client. Read only mode removes the write tools; orders preview by default and commit only with dry_run false; every call is audited. SQLite backend in one class, swappable for any CRM or ERP API. MIT.

Documentation

Ops MCP server

An MCP server (Python, official mcp SDK, FastMCP) that lets Claude Desktop, Claude Code or any MCP client work with a company's operations data through ten typed, audited tools over contacts, deals, tasks, notes, inventory and sales orders, plus three resources and a briefing prompt. Built and tested on sample data by Finamatik. The SQLite backend is one class (backend.py) and is the only thing to swap for a real CRM, ERP or project system.

ToolKindGuardrail
search_contacts(query, limit)readquery at least 2 characters, limit capped at 50
get_contact(contact_id)readfull view: deals, open tasks, last notes, last orders
list_tasks(status, assignee, due_before, limit)readISO date validated
check_inventory(sku, low_stock_only)read
pipeline_summary()readdeals by stage, open value, closing in 30 days
add_note(contact_id, text)write1 to 2,000 characters, contact must exist
create_task(contact_id, title, due_date, assignee)writeno past due dates, assignee enum
complete_task(task_id)writeidempotent
update_deal_stage(deal_id, stage)writestage enum
create_order(contact_id, sku, qty, dry_run=true)writestock check; preview first, commit only with dry_run=false

Safety model: tool annotations (readOnlyHint, destructiveHint, idempotentHint) so clients can ask before writes; OPS_MCP_READ_ONLY=1 removes the write tools from the tool list entirely; every call is appended to audit.jsonl (timestamp, tool, arguments, ok or error, duration); validation errors come back as MCP tool errors the model can act on.

Run

pip install "mcp>=1.27" pytest
python3 server.py                       # stdio, what Claude Desktop uses; seeds sample data on first start
python3 -m pytest tests -q              # 6 end to end tests through a real MCP client
npx @modelcontextprotocol/inspector --config inspector.config.json --server ops-mcp

Claude Desktop, claude_desktop_config.json:

{ "mcpServers": { "ops-mcp": { "command": "python3", "args": ["/absolute/path/ops-mcp-server/server.py"], "env": { "OPS_MCP_READ_ONLY": "0" } } } }

Claude Code: claude mcp add ops-mcp -- python3 /absolute/path/ops-mcp-server/server.py

Remote: OPS_MCP_TRANSPORT=streamable-http python3 server.py serves /mcp on port 8000; put authentication in front of it.

Files

server.py tools, resources and prompt. backend.py data layer and sample seed (40 contacts, 25 deals, 30 tasks, 10 SKUs, 20 orders). tests/test_server.py. inspector.config.json. audit.jsonl is created on the first call.

MIT licence, copyright Finamatik Business Solutions FZE LLC. Questions and production use: info@finamatik.com.