Uproc MCP Guide

What is this?

MCP lets AI clients such as OpenCode, Claude Code, Codex, Cursor, or similar tools connect directly to your Uproc workspace.

In practice, this means your client can:

  • list your available modules
  • read KPIs and data collections
  • fetch records such as invoices, submissions, or leads
  • use Uproc as a live data source instead of copied text

Most users only need the client configuration examples and the common usage examples below.

What you need

Use these runtime values:

  • UPROC_API_URL: https://api.uproc.io/api/v1/external/mcp
  • CUSTOMER_USER_API_KEY: $CUSTOMER_USER_API_KEY

Authentication is Bearer with your user API key (no email or domain headers). Generate or rotate your key from your profile, Integrations tab → API key. If you already have one, it is used as-is.

Send Authorization: Bearer <user API key> on every HTTP request, including requests that already carry the Mcp-Session-Id header: the server validates the key on each call and binds every session to the user that created it. If a session is lost or expires, re-initialize; the server may also refresh it automatically (Mcp-Session-Refreshed: true response header).

Protocol: the server supports MCP protocol versions 2025-03-26 and 2025-06-18. Initialization negotiates the version (unsupported requests fall back to the newest supported one). Clients SHOULD send the negotiated version in the MCP-Protocol-Version header on subsequent requests; when the header is missing the server assumes 2025-03-26, and an unsupported value returns HTTP 400.

Connect your client

OpenCode

Add this remote MCP server to opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "uproc": {
      "type": "remote",
      "url": "https://api.uproc.io/api/v1/external/mcp",
      "oauth": false,
      "headers": {
        "Authorization": "Bearer $CUSTOMER_USER_API_KEY"
      },
      "enabled": true
    }
  }
}

Check it works:

opencode mcp list
opencode mcp debug uproc

Claude Code

Add the remote MCP server:

claude mcp add --transport http uproc "https://api.uproc.io/api/v1/external/mcp" \
  --header "Authorization: Bearer $CUSTOMER_USER_API_KEY"

Check it works:

claude mcp list
claude mcp get uproc

Codex CLI

Add this to ~/.codex/config.toml or .codex/config.toml:

[mcp_servers.uproc]
url = "https://api.uproc.io/api/v1/external/mcp"
enabled = true
env_http_headers = { "Authorization" = "CUSTOMER_USER_API_KEY" }

Export the key wrapped with the Bearer prefix before launching Codex (Codex sends the header value verbatim):

export CUSTOMER_USER_API_KEY="Bearer $CUSTOMER_USER_API_KEY"
codex

Other MCP clients

Clients such as Cursor, Cline, and Windsurf usually accept the same remote HTTP MCP shape: URL plus headers.

{
  "mcpServers": {
    "uproc": {
      "type": "http",
      "url": "https://api.uproc.io/api/v1/external/mcp",
      "headers": {
        "Authorization": "Bearer $CUSTOMER_USER_API_KEY"
      }
    }
  }
}

If your client expects streamable-http instead of http, keep the same URL and headers and only change the transport label.

Try these prompts

These examples are usually more useful than raw MCP payloads:

  • List my Uproc modules
  • Search the right module for last received invoices
  • Resolve get last received invoices at uproc
  • Show KPI summary for invoice ingest
  • Get the last invoices
  • List the available collections for invoice ingest
  • Show the latest records in lead management
  • Show the latest form generator submissions

Natural-language discovery is now available server-side through modules.search and modules.resolve.

Permission-aware semantic shortcuts are also exposed directly in tools/list using the pattern module-slug.collection.action, for example:

  • purchase-invoices.invoices.list
  • purchase-invoices.emails.search
  • document-generator.documents.list
  • document-signing.requests.list
  • purchase-invoices.invoices.upload
  • lead-management.leads.create

The exact shortcuts available depend on the module collections exposed by the server metadata for your workspace.

Common direct tool calls

List modules

{
  "name": "modules.list",
  "arguments": {}
}

Search modules with natural language

{
  "name": "modules.search",
  "arguments": {
    "query": "last received invoices",
    "limit": 5
  }
}

Resolve a natural-language request to a suggested tool call

{
  "name": "modules.resolve",
  "arguments": {
    "query": "get last received invoices at uproc",
    "mode": "discover"
  }
}

Resolve and execute a high-confidence read query

{
  "name": "modules.resolve",
  "arguments": {
    "query": "get last received invoices at uproc",
    "mode": "execute"
  }
}

Use a semantic shortcut directly

{
  "name": "purchase-invoices.invoices.list",
  "arguments": {
    "page": 1,
    "sort_field": "created_at",
    "sort_order": "desc"
  }
}

Create a lead through a semantic shortcut

{
  "name": "lead-management.leads.create",
  "arguments": {
    "item": {
      "company": "Cliente X",
      "contact": "Laura Navarro",
      "email": "[email protected]"
    }
  }
}

Create a candidate profile through module.create

{
  "name": "module.create",
  "arguments": {
    "module_slug": "candidate-evaluation",
    "collection_name": "profiles",
    "item": {
      "full_name": "Eva Ruiz",
      "email": "[email protected]"
    }
  }
}

Create a form submission through module.create

{
  "name": "module.create",
  "arguments": {
    "module_slug": "form-generator",
    "collection_name": "submissions",
    "item": {
      "form_id": 10,
      "payload": {
        "email": "[email protected]"
      }
    }
  }
}

Generic module.create currently supports these writable collection pairs:

  • lead-management.leads
  • candidate-evaluation.job_openings
  • candidate-evaluation.profiles
  • candidate-evaluation.applications
  • candidate-evaluation.evaluations
  • form-generator.forms
  • form-generator.fields
  • form-generator.submissions

Get module KPIs

{
  "name": "module.kpis",
  "arguments": {
    "module_slug": "purchase-invoices"
  }
}

Describe module capabilities

{
  "name": "module.capabilities",
  "arguments": {
    "module_slug": "purchase-invoices"
  }
}

List module entities and aliases

{
  "name": "module.entities",
  "arguments": {
    "module_slug": "purchase-invoices"
  }
}

List collections for a module

{
  "name": "module.collections",
  "arguments": {
    "module_slug": "purchase-invoices"
  }
}

Get the last invoices

{
  "name": "module.data",
  "arguments": {
    "module_slug": "purchase-invoices",
    "collection_name": "invoices",
    "sort_field": "created_at",
    "sort_order": "desc",
    "page": 1
  }
}

Get the latest leads

{
  "name": "module.data",
  "arguments": {
    "module_slug": "lead-management",
    "collection_name": "leads",
    "page": 1
  }
}

Create a lead with the generic module tool

{
  "name": "module.create",
  "arguments": {
    "module_slug": "lead-management",
    "collection_name": "leads",
    "item": {
      "company": "Acme"
    }
  }
}

List available actions for a module

{
  "name": "module.actions",
  "arguments": {
    "module_slug": "lead-management"
  }
}

Run a generic module action

{
  "name": "module.action",
  "arguments": {
    "module_slug": "lead-management",
    "action": "generate_lead_proposal",
    "item": {
      "lead_id": 123
    }
  }
}

Generate a lead proposal

{
  "name": "lead-management.generate_lead_proposal",
  "arguments": {
    "lead_id": 123,
    "title": "Commercial proposal",
    "description": "Short summary",
    "output_format": "pdf"
  }
}

Send a lead proposal

{
  "name": "lead-management.send_lead_proposal",
  "arguments": {
    "lead_id": 123,
    "mailbox_id": 7,
    "to_email": "[email protected]",
    "subject": "Proposal",
    "body": "Please find the proposal attached."
  }
}

Rerun lead intelligence

{
  "name": "lead-management.rerun_lead_intelligence",
  "arguments": {
    "lead_id": 123
  }
}

Run lead prospecting discovery

{
  "name": "lead-prospecting.run_discovery",
  "arguments": {
    "strategy_id": 55,
    "company": "Acme",
    "domain": "acme.com"
  }
}

Send a prospecting opportunity to leads

{
  "name": "lead-prospecting.send_opportunity_to_leads",
  "arguments": {
    "opportunity_id": 77
  }
}

Ask a business question through the data chatbot

{
  "name": "data-chatbot.send_chat_query",
  "arguments": {
    "domain": "sales",
    "question": "How many leads did we create this week?"
  }
}

List data-chatbot domains and available questions

{
  "name": "data-chatbot.list_domains",
  "arguments": {}
}

Continue a data-chatbot conversation

{
  "name": "data-chatbot.follow_up",
  "arguments": {
    "origin_session_id": "web:7:S-1",
    "question": "And compared to last month?"
  }
}

Preview a campaign audience

{
  "name": "campaign-automation.preview_audience",
  "arguments": {
    "campaign_id": 12,
    "limit": 5
  }
}

Add an audience to a campaign

{
  "name": "campaign-automation.add_audience",
  "arguments": {
    "campaign_id": 12,
    "mode": "snapshot"
  }
}

Import a campaign audience from CSV

{
  "name": "campaign-automation.import_audience_csv",
  "arguments": {
    "campaign_id": 12,
    "file_name": "audience.csv",
    "content": "<base64>"
  }
}

Record a campaign execution event

{
  "name": "campaign-automation.record_execution_event",
  "arguments": {
    "campaign_id": 12,
    "execution_id": 33,
    "channel": "email",
    "event_type": "opened"
  }
}

Get campaign execution stats

{
  "name": "campaign-automation.get_execution_stats",
  "arguments": {
    "campaign_id": 12,
    "channel": "email"
  }
}

Pause a campaign

{
  "name": "campaign-automation.pause_campaign",
  "arguments": {
    "campaign_id": 12
  }
}

Activate a campaign

{
  "name": "campaign-automation.activate_campaign",
  "arguments": {
    "campaign_id": 12
  }
}

Approve a market signal

{
  "name": "market-signals.approve_signal",
  "arguments": {
    "signal_id": 44
  }
}

Generate an editorial proposal

{
  "name": "editorial-engine.generate_proposal",
  "arguments": {
    "opportunity_id": 31
  }
}

Run a data-sync workflow

{
  "name": "data-sync.run_workflow",
  "arguments": {
    "workflow_id": 44
  }
}

Preview a data-sync workflow

Inline preview (no saved workflow needed) with pagination and server-side filters (provider-unsupported fields are ignored and reported in unsupported_filters):

{
  "name": "data-sync.preview_workflow",
  "arguments": {
    "source_credential_id": 44,
    "source_resource": "invoices",
    "page_size": 25,
    "filters": { "status": "issued" }
  }
}

Pass next_page_state from the previous response to fetch the following page:

{
  "name": "data-sync.preview_workflow",
  "arguments": {
    "source_credential_id": 44,
    "source_resource": "invoices",
    "page_state": { "cursor": "..." }
  }
}

A saved workflow can also be previewed with workflow_id (same paginated contract).

Dry-run a data-sync workflow

{
  "name": "data-sync.dry_run_workflow",
  "arguments": {
    "workflow_id": 44,
    "limit": 10
  }
}

ERP sync (module level)

sales-invoices and purchase-invoices expose configure_erp_sync (set erp_sync_mode: none/full/pull/push), export_to_erp (send a specific record; requires full or push) and run_erp_sync (run the linked workflows now).

{
  "name": "sales-invoices.configure_erp_sync",
  "arguments": { "mode": "push" }
}
{
  "name": "sales-invoices.export_to_erp",
  "arguments": { "invoice_id": 9 }
}

data-sync.push_to_erp writes a record to an ERP provider using a stored credential:

{
  "name": "data-sync.push_to_erp",
  "arguments": {
    "credential_id": 3,
    "resource": "invoices",
    "operation": "create",
    "item": { "number": "H-1", "total": 121 }
  }
}

VeriFactu (Spain)

{
  "name": "sales-invoices.resubmit_verifactu",
  "arguments": { "invoice_id": 9 }
}
{
  "name": "sales-invoices.backfill_verifactu",
  "arguments": {}
}
{
  "name": "sales-invoices.get_verifactu_xml",
  "arguments": { "invoice_id": 9 }
}

Preview a data-management import

{
  "name": "data-management.preview_import",
  "arguments": {
    "collection_name": "providers",
    "file_name": "providers.csv",
    "content": "<base64>",
    "entity_id": 3
  }
}

Queue a data-management import

{
  "name": "data-management.enqueue_import",
  "arguments": {
    "collection_name": "providers",
    "file_name": "providers.csv",
    "content": "<base64>",
    "entity_id": 3,
    "mapping": {
      "Email": "email"
    }
  }
}

Check a data-management upload

{
  "name": "data-management.get_upload_status",
  "arguments": {
    "upload_id": 9
  }
}

List data-management tables

{
  "name": "data-management.list_tables",
  "arguments": {}
}

Create a data-management table

{
  "name": "data-management.create_table",
  "arguments": {
    "item": {
      "name": "providers",
      "description": "Vendor master"
    }
  }
}

List columns in a data-management table

{
  "name": "data-management.list_columns",
  "arguments": {
    "entity_id": 3
  }
}

Create a data-management column

{
  "name": "data-management.create_column",
  "arguments": {
    "entity_id": 3,
    "item": {
      "key": "email",
      "label": "Email",
      "type": "text"
    }
  }
}

Transfer all Data Management schema and rows

data-management.export_transfer returns a portable ZIP in zip_base64. Save it outside the source machine, then call data-management.import_transfer against the destination customer. The first import call is a preview; set confirm: true only after reviewing it. The transfer replaces only Data Management entities, columns, and rows. It excludes users, credentials, customer settings, and attachments. Both tools require an authorized admin user API key.

{
  "name": "data-management.import_transfer",
  "arguments": {
    "zip_base64": "<portable-zip-base64>",
    "confirm": false
  }
}

Regenerate a normalization plan

{
  "name": "data-management.regenerate_plan",
  "arguments": {
    "plan_id": 18
  }
}

Create a customer care ticket

{
  "name": "customer-care.create_ticket",
  "arguments": {
    "item": {
      "subject": "Delayed shipment",
      "status": "open"
    }
  }
}

Update a customer care ticket status

{
  "name": "customer-care.update_ticket_status",
  "arguments": {
    "ticket_id": 17,
    "status": "closed"
  }
}

Assign a customer care ticket

{
  "name": "customer-care.assign_ticket",
  "arguments": {
    "ticket_id": 17,
    "assignee": "[email protected]"
  }
}

Reply to a customer care ticket

{
  "name": "customer-care.reply_to_ticket",
  "arguments": {
    "ticket_id": 17,
    "message": "We are reviewing this now."
  }
}

Mark a customer care ticket as resolved

{
  "name": "customer-care.mark_resolved",
  "arguments": {
    "ticket_id": 17
  }
}

Close a customer care ticket

{
  "name": "customer-care.close_ticket",
  "arguments": {
    "ticket_id": 17
  }
}

Reopen a customer care ticket

{
  "name": "customer-care.reopen_ticket",
  "arguments": {
    "ticket_id": 17
  }
}

Approve an approval request

{
  "name": "approval-management.approve_request",
  "arguments": {
    "request_id": 21
  }
}

Reassign an approval request

{
  "name": "approval-management.reassign_request",
  "arguments": {
    "request_id": 21,
    "approver": "Eve Manager",
    "note": "handoff needed"
  }
}

Reject an approval request

{
  "name": "approval-management.reject_request",
  "arguments": {
    "request_id": 21
  }
}

Cancel an approval request

{
  "name": "approval-management.cancel_request",
  "arguments": {
    "request_id": 21
  }
}

Mark an inventory order as received

{
  "name": "inventory-planning.mark_received",
  "arguments": {
    "order_id": 301
  }
}

Cancel an inventory order

{
  "name": "inventory-planning.cancel_order",
  "arguments": {
    "order_id": 301
  }
}

Send a reminder on an inventory order

{
  "name": "inventory-planning.send_reminder",
  "arguments": {
    "order_id": 301
  }
}

Mark a tracked order as received

{
  "name": "order-track.mark_received",
  "arguments": {
    "order_id": 44
  }
}

Cancel a tracked order

{
  "name": "order-track.cancel_order",
  "arguments": {
    "order_id": 44
  }
}

Send a reminder on a tracked order

{
  "name": "order-track.send_reminder",
  "arguments": {
    "order_id": 44
  }
}

Create a candidate profile

{
  "name": "candidate-evaluation.create_profile",
  "arguments": {
    "item": {
      "full_name": "Eva Ruiz",
      "email": "[email protected]"
    }
  }
}

Create a candidate application

{
  "name": "candidate-evaluation.create_application",
  "arguments": {
    "item": {
      "profile_id": 8,
      "job_opening_id": 12,
      "stage": "applied"
    }
  }
}

Create a job opening

{
  "name": "candidate-evaluation.create_job_opening",
  "arguments": {
    "item": {
      "title": "Senior Backend Engineer",
      "department": "Engineering"
    }
  }
}

Move a candidate application stage

{
  "name": "candidate-evaluation.move_application_stage",
  "arguments": {
    "application_id": 15,
    "stage": "screening"
  }
}

Update a candidate application status

{
  "name": "candidate-evaluation.update_application_status",
  "arguments": {
    "application_id": 15,
    "status": "hired"
  }
}

Create a candidate evaluation

{
  "name": "candidate-evaluation.create_evaluation",
  "arguments": {
    "item": {
      "application_id": 15,
      "round_name": "HR",
      "score_total": 8.5
    }
  }
}

Publish a form

{
  "name": "form-generator.publish_form",
  "arguments": {
    "form_id": 10
  }
}

Archive a form

{
  "name": "form-generator.archive_form",
  "arguments": {
    "form_id": 10
  }
}

Restore a form

{
  "name": "form-generator.restore_form",
  "arguments": {
    "form_id": 10
  }
}

Mark a submission as processed

{
  "name": "form-generator.mark_submission_processed",
  "arguments": {
    "submission_id": 25
  }
}

Archive a submission

{
  "name": "form-generator.archive_submission",
  "arguments": {
    "submission_id": 25
  }
}

Reprocess an ingested order

{
  "name": "order-ingest.reprocess_order",
  "arguments": {
    "order_id": 12
  }
}

Validate an ingested order

{
  "name": "order-ingest.validate_order",
  "arguments": {
    "order_id": 12
  }
}

Send an ingested order to ERP

{
  "name": "order-ingest.send_order_to_erp",
  "arguments": {
    "order_id": 12
  }
}

Mark an email as processed

{
  "name": "email-assistant.mark_processed",
  "arguments": {
    "email_id": 5
  }
}

Archive an email

{
  "name": "email-assistant.archive_email",
  "arguments": {
    "email_id": 5
  }
}

Retry a process step

{
  "name": "process-visibility.retry_step",
  "arguments": {
    "process_id": 77
  }
}

Reassign a process owner flow

{
  "name": "process-visibility.reassign_owner",
  "arguments": {
    "process_id": 77
  }
}

Cancel a process

{
  "name": "process-visibility.cancel_process",
  "arguments": {
    "process_id": 77
  }
}

Send a signing reminder

{
  "name": "document-signing.send_reminder",
  "arguments": {
    "request_id": 52
  }
}

Sync a signing request status

{
  "name": "document-signing.sync_status",
  "arguments": {
    "request_id": 52
  }
}

Reopen a signing request

{
  "name": "document-signing.reopen_request",
  "arguments": {
    "request_id": 52
  }
}

Cancel a signing request

{
  "name": "document-signing.cancel_request",
  "arguments": {
    "request_id": 52
  }
}

Mark a generated document as ready

{
  "name": "document-generator.mark_ready",
  "arguments": {
    "document_id": 61
  }
}

Return a generated document to review

{
  "name": "document-generator.mark_review",
  "arguments": {
    "document_id": 61
  }
}

Regenerate a document

{
  "name": "document-generator.regenerate_document",
  "arguments": {
    "document_id": 61
  }
}

Archive a generated document

{
  "name": "document-generator.archive_document",
  "arguments": {
    "document_id": 61
  }
}

Restore a generated document

{
  "name": "document-generator.restore_document",
  "arguments": {
    "document_id": 61
  }
}

Rectify an invoice

{
  "name": "sales-invoices.rectify_invoice",
  "arguments": {
    "invoice_id": 98,
    "reason": "Correction"
  }
}

Get an invoice PDF

{
  "name": "sales-invoices.get_invoice_pdf",
  "arguments": {
    "invoice_id": 98
  }
}

Add an invoice line

{
  "name": "sales-invoices.add_invoice_line",
  "arguments": {
    "invoice_id": 98,
    "concept": "Consulting",
    "quantity": 2,
    "unit_price": 100
  }
}

Update an invoice line

{
  "name": "sales-invoices.update_invoice_line",
  "arguments": {
    "invoice_id": 98,
    "line_id": 3,
    "quantity": 4
  }
}

Delete an invoice line

{
  "name": "sales-invoices.delete_invoice_line",
  "arguments": {
    "invoice_id": 98,
    "line_id": 3
  }
}

Issue an invoice

{
  "name": "sales-invoices.issue_invoice",
  "arguments": {
    "invoice_id": 98
  }
}

Preview an invoice PDF

{
  "name": "sales-invoices.preview_invoice_pdf",
  "arguments": {
    "invoice": {
      "series": "A"
    },
    "lines": [
      {
        "concept": "Consulting"
      }
    ]
  }
}

Send an invoice

{
  "name": "sales-invoices.send_invoice",
  "arguments": {
    "invoice_id": 98,
    "email": "[email protected]",
    "subject": "Invoice",
    "message": "Please find the invoice attached."
  }
}

Change a purchase invoice status (validate/pay)

{
  "name": "purchase-invoices.change_status",
  "arguments": {
    "item_id": 5,
    "status": "paid",
    "reason": "Bank transfer"
  }
}

Assign a purchase invoice from ingest

{
  "name": "purchase-invoices.assign_from_ingest",
  "arguments": {
    "invoice_id": 42
  }
}

Run financial reconciliation

{
  "name": "financial-reconciliation.reconcile",
  "arguments": {
    "process_id": 5
  }
}

Update a contract

{
  "name": "contract-lifecycle.update_contract",
  "arguments": {
    "contract_id": 12,
    "data": {
      "status": "renewal"
    }
  }
}

Upload a contract document

{
  "name": "contract-lifecycle.upload_contract_document",
  "arguments": {
    "contract_id": 12,
    "file_name": "nda.pdf",
    "content": "<base64>"
  }
}

Create a case note

{
  "name": "case-lifecycle.create_case_note",
  "arguments": {
    "case_id": 14,
    "content": "Customer called back"
  }
}

Data-process and profile tools

  • data-process.search — search the tool catalog (optional query matches key/name/description).
  • data-process.tool — get the full spec of a single tool (tool key): params with accepted/format, output, cost, extended_description.
  • data-process.execute — run a data-process tool inline (no daily inline-call limit; balance and daily budget apply). Example params: {"processor":"check-creditcard-checksum","params":{"credit_card":"4024007151839544"}}. Free (not billed: the response carries free/free_reason and real_price: 0) when the result comes from the back cache, the tool answers result: false, or the tool price is 0 — controlled by DATA_PROCESS_CHARGE_ON_FALSE.
  • data-process.batch — queue a background run over a data-management entity (tool, source_entity_id).
  • module.data data-process runs — list recent data-process runs (data-process is now a cataloged module).
  • profile.get / profile.update — read/update the connected user’s profile (identified via the user API key).
  • sales-invoices.generate_recurring_invoice, purchase-invoices.generate_recurring_invoice, purchase-invoices.create_recurring_from_invoice — convert between invoices and recurring templates.

Migrated data-process tools are served by the native Python implementation; tools not yet migrated fall back to the legacy platform automatically (DATA_PROCESS_TOOLS_MODE=auto). A native tool depending on an external provider is used only when its TOOL_* credential env var is configured, otherwise it falls back to legacy.

Troubleshooting

  • If the client does not connect, verify the URL and the Authorization header.
  • The Authorization header must be exactly Bearer <user API key> — no email or domain headers.
  • Every request must include the Authorization header: requests with a valid Mcp-Session-Id but no Bearer key are rejected with JSON-RPC error -32001.
  • If you receive HTTP 400 Unsupported MCP-Protocol-Version, send the negotiated version in the MCP-Protocol-Version header (supported: 2025-03-26, 2025-06-18).
  • If your client supports MCP debugging, run its MCP status/debug command first.
  • If a direct module query fails, first call module.collections for that module and verify the collection name.

Advanced MCP reference

Most users do not need the sections below unless they are building a custom integration or debugging the transport.

MCP endpoints

EndpointMethodDescription
/api/v1/external/mcpPOSTJSON-RPC transport (initialize, tools/list, tools/call, resources/read)
/api/v1/external/mcp/toolsGETList canonical tools
/api/v1/external/mcp/resourcesGETList contract resources
/api/v1/external/mcp/resources/readPOSTRead one contract resource
/api/v1/external/mcp/callPOSTExecute one tool without session handling

Canonical tool names

Module tools

  • modules.list
  • modules.search
  • modules.resolve
  • module.get
  • module.capabilities
  • module.entities
  • module.kpis
  • module.collections
  • module.collection
  • module.data
  • module.create
  • module.update
  • module.actions
  • module.action
  • module.upload
  • module.webhook

Concrete business-action tools

  • lead-management.generate_lead_proposal
  • lead-management.send_lead_proposal
  • lead-management.rerun_lead_intelligence
  • lead-prospecting.run_discovery
  • lead-prospecting.send_opportunity_to_leads
  • data-chatbot.send_chat_query
  • data-chatbot.list_domains
  • data-chatbot.follow_up
  • campaign-automation.preview_audience
  • campaign-automation.add_audience
  • campaign-automation.import_audience_csv
  • campaign-automation.record_execution_event
  • campaign-automation.get_execution_stats
  • campaign-automation.pause_campaign
  • campaign-automation.activate_campaign
  • data-sync.run_workflow
  • data-sync.preview_workflow
  • data-sync.dry_run_workflow
  • sales-invoices.rectify_invoice
  • sales-invoices.get_invoice_pdf
  • sales-invoices.issue_invoice
  • sales-invoices.add_invoice_line
  • sales-invoices.update_invoice_line
  • sales-invoices.delete_invoice_line
  • sales-invoices.preview_invoice_pdf
  • sales-invoices.send_invoice
  • purchase-invoices.change_status
  • purchase-invoices.assign_from_ingest
  • financial-reconciliation.reconcile
  • contract-lifecycle.update_contract
  • contract-lifecycle.upload_contract_document
  • contract-lifecycle.renew_contract
  • contract-lifecycle.terminate_contract
  • case-lifecycle.create_case_note
  • case-lifecycle.close_case
  • case-lifecycle.reopen_case
  • data-management.preview_import
  • data-management.enqueue_import
  • data-management.get_upload_status
  • data-management.get_latest_upload
  • data-management.list_tables
  • data-management.create_table
  • data-management.update_table
  • data-management.list_columns
  • data-management.create_column
  • data-management.update_column
  • data-management.reorder_columns
  • data-management.export_transfer
  • data-management.import_transfer
  • data-management.regenerate_plan
  • customer-care.create_ticket
  • customer-care.update_ticket_status
  • customer-care.assign_ticket
  • customer-care.reply_to_ticket
  • customer-care.mark_resolved
  • customer-care.close_ticket
  • customer-care.reopen_ticket
  • approval-management.approve_request
  • approval-management.reassign_request
  • approval-management.reject_request
  • approval-management.cancel_request
  • inventory-planning.mark_received
  • inventory-planning.cancel_order
  • inventory-planning.send_reminder
  • order-track.mark_received
  • order-track.cancel_order
  • order-track.send_reminder
  • candidate-evaluation.create_profile
  • candidate-evaluation.create_application
  • candidate-evaluation.create_job_opening
  • candidate-evaluation.move_application_stage
  • candidate-evaluation.update_application_status
  • candidate-evaluation.create_evaluation
  • form-generator.publish_form
  • form-generator.archive_form
  • form-generator.restore_form
  • form-generator.mark_submission_processed
  • form-generator.archive_submission
  • order-ingest.reprocess_order
  • order-ingest.validate_order
  • order-ingest.send_order_to_erp
  • email-assistant.mark_processed
  • email-assistant.archive_email
  • process-visibility.retry_step
  • process-visibility.reassign_owner
  • process-visibility.cancel_process
  • market-signals.approve_signal
  • market-signals.discard_signal
  • market-signals.mark_pending_review
  • market-signals.activate_signal
  • market-signals.close_signal
  • editorial-engine.generate_proposal
  • editorial-engine.generate_article
  • editorial-engine.publish
  • editorial-engine.schedule
  • editorial-engine.discard
  • tax-compliance.generate_report
  • tax-compliance.recalculate_report
  • tax-compliance.validate_report
  • tax-compliance.export_report
  • document-signing.cancel_request
  • document-signing.reopen_request
  • document-signing.send_reminder
  • document-signing.sync_status
  • document-generator.mark_ready
  • document-generator.mark_review
  • document-generator.archive_document
  • document-generator.restore_document
  • document-generator.regenerate_document

Permission-aware semantic shortcuts

Pattern: module-slug.collection.action

Examples:

  • purchase-invoices.invoices.list
  • purchase-invoices.invoices.get
  • purchase-invoices.invoices.search
  • purchase-invoices.invoices.upload
  • lead-management.leads.list
  • lead-management.leads.create

These shortcuts are generated dynamically from the authenticated user’s available modules, collections, and externally allowed write operations.

module_slug is always passed in arguments for module-scoped tools.

Resources

MCP resources expose the active contracts used by the server:

  • contract://modules/<action>

Example:

{
  "uri": "contract://modules/kpis"
}

Raw JSON-RPC with curl

Initialize a session:

curl -i -X POST "https://api.uproc.io/api/v1/external/mcp" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $CUSTOMER_USER_API_KEY" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2025-03-26",
      "capabilities": {},
      "clientInfo": {"name": "curl", "version": "1.0"}
    }
  }'

Call a tool after copying the Mcp-Session-Id response header:

curl -X POST "https://api.uproc.io/api/v1/external/mcp" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $CUSTOMER_USER_API_KEY" \
  -H "Mcp-Session-Id: <SESSION_ID>" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "modules.list",
      "arguments": {}
    }
  }'

Direct no-session fallback:

curl -X POST "https://api.uproc.io/api/v1/external/mcp/call" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $CUSTOMER_USER_API_KEY" \
  -d '{
    "name": "module.kpis",
    "arguments": {"module_slug": "purchase-invoices"}
  }'

Error format

{
  "success": false,
  "message": "validation.error",
  "data": {
    "errors": []
  }
}

Data chatbot sessions

List the connected user’s sessions, optionally filtered by source.

{
  "name": "data-chatbot.list_sessions",
  "arguments": { "source": "mcp" }
}

Sales invoice cancellation (VeriFactu)

{
  "name": "sales-invoices.cancel_invoice",
  "arguments": { "invoice_id": 9, "reason": "Duplicate" }
}

Run the VeriFactu AEAT workflow

{
  "name": "sales-invoices.run_verifactu",
  "arguments": {}
}

Enabling verifactu_enabled on sales-invoices automatically creates the VeriFactu AEAT · sales-invoices data-sync workflow (scheduled + manual from sales); run_verifactu sends pending registrations to the AEAT now.

FileSync transfer

{
  "name": "file-sync.run_transfer",
  "arguments": { "transfer_id": 1 }
}