Skip to main content
Glama
Ops MCP Server (Finamatik)

Ops MCP Server (Finamatik)

Official

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, logged 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.

Tool

Kind

Guardrail

search_contacts(query, limit)

read

query at least 2 characters, limit capped at 50

get_contact(contact_id)

read

full view: deals, open tasks, last notes, last orders

list_tasks(status, assignee, due_before, limit)

read

ISO date validated

check_inventory(sku, low_stock_only)

read

pipeline_summary()

read

deals by stage, open value, closing in 30 days

add_note(contact_id, text)

write

1 to 2,000 characters, contact must exist

create_task(contact_id, title, due_date, assignee)

write

no past due dates, assignee enum

complete_task(task_id)

write

idempotent

update_deal_stage(deal_id, stage)

write

stage enum

create_order(contact_id, sku, qty, dry_run=true)

write

stock 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.

Install and run

pip install finamatik-ops-mcp
finamatik-ops-mcp                        # stdio, what Claude Desktop uses; seeds sample data on first start
OPS_MCP_READ_ONLY=1 finamatik-ops-mcp    # read only: the write tools are not registered at all

Data lives in ~/.finamatik-ops-mcp/ (ops.db and audit.jsonl). Move it with OPS_MCP_HOME, or point at specific files with OPS_MCP_DB and OPS_MCP_AUDIT.

Claude Desktop, claude_desktop_config.json:

{ "mcpServers": { "ops-mcp": { "command": "finamatik-ops-mcp", "env": { "OPS_MCP_READ_ONLY": "0" } } } }

Claude Code: claude mcp add ops-mcp -- finamatik-ops-mcp

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

From source:

git clone https://github.com/finamatik/ops-mcp-server && cd ops-mcp-server
pip install -e ".[test]"
python3 server.py                       # same server, run from the checkout
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

Requires Python 3.10 or later and the official mcp SDK 1.27 or later (pinned below 2.0; the 2.x SDK renamed FastMCP).

Related MCP server: mcp-saas-connector

Files

finamatik_ops_mcp/server.py tools, resources, prompt and the main() entry point. finamatik_ops_mcp/backend.py data layer and sample seed (40 contacts, 25 deals, 30 tasks, 10 SKUs, 20 orders). server.py and backend.py at the root are thin shims so python3 server.py still works from a checkout. tests/test_server.py. inspector.config.json. server.json is the MCP registry manifest. .github/workflows/publish.yml publishes a GitHub release to PyPI with trusted publishing.

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

Available Tools

10 tools
add_noteA

Append a timestamped note to a contact's timeline (max 2,000 characters).

Inputs: text (required), contact_id (required). Returns: object

check_inventoryA
Read-onlyIdempotent

Stock levels. Pass a SKU for one item, or low_stock_only=true for items at/below their reorder level.

Inputs: sku, low_stock_only. Returns: result

complete_taskC
Idempotent

Mark a task done (idempotent).

Inputs: task_id (required). Returns: object

create_orderA

Place a sales order for a contact. Checks stock first. dry_run=true (default) only returns a priced preview , confirm with the user, then call again with dry_run=false to commit and decrement inventory.

Inputs: qty (required), sku (required), contact_id (required), dry_run. Returns: object

create_taskB

Create an open task for a contact. due_date is YYYY-MM-DD and may not be in the past.

Inputs: title (required), assignee (required), due_date (required), contact_id (required). Returns: object

get_contactA
Read-onlyIdempotent

Full view of one contact: profile, deals, open tasks, last 5 notes, last 5 orders. Use the id from search_contacts (e.g. C-1007).

Inputs: contact_id (required). Returns: object

list_tasksA
Read-onlyIdempotent

List tasks, default open ones, optionally filtered by assignee (hamza|sana|ali) and due date (YYYY-MM-DD). Sorted by due date.

Inputs: limit, status, assignee, due_before. Returns: result

pipeline_summaryA
Read-onlyIdempotent

Deals by stage (count + AED value), open pipeline total, and open deals expected to close in the next 30 days.

Inputs: no named parameters. Returns: object

search_contactsA
Read-onlyIdempotent

Find contacts by name, company, email, phone or city (case-insensitive substring). Returns up to limit (max 50).

Inputs: query (required), limit. Returns: result

update_deal_stageC

Move a deal to a new pipeline stage.

Inputs: stage (required), deal_id (required). Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 10 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose: search vs. full profile lookup (search_contacts/get_contact), task listing vs. creation vs. completion, and inventory, pipeline, note, and order operations are all separate concerns. The only near-overlap (check_inventory vs. create_order stock check) is explicitly clarified in the descriptions.

    Naming Consistency4/5

    Most tools follow a clean verb_noun pattern (search_contacts, get_contact, list_tasks, add_note, create_task, complete_task, update_deal_stage, create_order). The single outlier is pipeline_summary, which is noun-only with no verb, a minor deviation from an otherwise consistent convention.

    Tool Count5/5

    Ten tools is well within the ideal 3-15 range and each one covers a distinct operational need for a CRM/ops assistant. No tool feels redundant or padded.

    Completeness3/5

    Tasks have list/create/complete but no update or delete, contacts can only be read (no create/update), and orders/deals lack listing or retrieval tools (e.g. no list_orders, get_deal, delete task). Core read workflows exist but the lifecycle surface has notable gaps that could cause dead ends.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      556-tool MCP server giving AI agents full access to the FutureSense business platform. Covers 10 app domains: invoicing, payroll, accounting, CRM, booking, content creation, website builder, quotations, email, and more. Works with Claude, ChatGPT, Gemini, Cursor, and any MCP-compatible client.
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI agents to manage CRM data including companies, contacts, prospects, pipelines, forecasts, and tasks via typed MCP tools, with local SQLite storage and a JSON CLI.
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      A production-ready MCP server built with Python, exposing 17 tools to manage users, products, and orders via a JSON-backed REST API, ready for Claude Desktop and any MCP client.
      -