Sanka

by sankaHQ

284 downloads
Not rated
GitHub

About

Sanka is the extension company. Plug AI into your sales lifecycle — deals, quotes, billing, and 100+ CRM/commerce integrations — directly from Claude or Codex.

Details

Author
sankaHQ
Downloads
284
Categories
Productivity, Other, AI

- Remote Streamable HTTP MCP endpoint for the Sanka platform
- Exposes both general SDK tools and read-only CRM tools
- Authenticates via Bearer token or x-sanka-api-key header
- Health check endpoint at GET /health
- Production and staging environments hosted on Fly.io
- CI/CD pipeline with automatic staging deploys on push to staging

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name Sanka
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

Remote clients connect to the production endpoint at https://mcp.sanka.com/mcp (or the legacy alias https://mcp.sanka.com/sse) and authenticate with either an Authorization: Bearer <token> header or an x-sanka-api-key: <token> header. For local development, run pnpm install, pnpm build, then start the server with node packages/mcp-server/dist/index.js --transport=http --port=8080. The health of any instance can be verified via GET /health.

get_capability_guidance

Fetch current hosted Sanka MCP capability guidance before refusing an ambiguous or newly added Sanka capability. Use this when local Skill text or visible tools may be stale.

list_job_postings

Search and review job postings in Sanka.

get_job_posting

Load one job posting by UUID or display id.

create_job_posting

Create a job posting using Sanka object property keys.

update_job_posting

Update a job posting using Sanka object property keys.

archive_job_posting

Archive a job posting without permanently deleting it.

activate_job_posting

Reactivate an archived job posting.

list_applicants

Search and review applicants in Sanka.

get_applicant

Load one applicant by UUID or display id.

create_applicant

Create a applicant using Sanka object property keys.

update_applicant

Update a applicant using Sanka object property keys.

archive_applicant

Archive a applicant without permanently deleting it.

activate_applicant

Reactivate an archived applicant.

list_interviews

Search and review interviews in Sanka.

get_interview

Load one interview by UUID or display id.

create_interview

Create a interview using Sanka object property keys.

update_interview

Update a interview using Sanka object property keys.

archive_interview

Archive a interview without permanently deleting it.

activate_interview

Reactivate an archived interview.

get_workforce_organization

Load the planned organization chart, staffing phases, and unassigned job postings.

create_org_position

Add a planned position to the ideal organization chart.

update_org_position

Update a planned position using optimistic version control.

set_org_position_job

Attach a job posting to a planned position, or detach it by passing job_id null.

set_org_position_occupant

Assign an employee to a planned position and optionally record the source applicant.

get_cargo_catalog

Read the global Cargo catalog operating view: category and supplier counts, research runs, publication blockers, RFQ intakes, LP snapshots, and import batches. This catalog is independent of workspace Company records.

import_cargo_catalog

Idempotently import a normalized Cargo research bundle into the global catalog. The bundle may contain categories, suppliers, research runs, sources, claims, raw artifacts, and draft or ready-for-review LP snapshots. This tool never publishes an LP snapshot.

connect_sanka

Start or resume the Sanka OAuth connection flow. Use this when the user explicitly asks to connect or reconnect Sanka.

auth_status

Debug whether the Sanka CRM connector is authenticated. Do not use this as a preflight before company or contact lookup tools.

current_workspace

Return the Sanka workspace currently bound to this OAuth credential, including workspace_name, workspace_code, and internal workspace_id. Use this to verify workspace context before live Sanka operations.

list_workspaces

List workspaces available to the authenticated Sanka OAuth session. Use the returned internal id with switch_workspace; do not use the short workspace_code as workspace_id.

switch_workspace

Switch the authenticated Sanka workspace. Pass the internal workspace_id from list_workspaces, not the short workspace_code. After switching, omit workspace_id on normal data tools.

invite_workspace_user

Invite one user to an explicitly verified Sanka workspace. Call current_workspace immediately before this tool and pass its internal workspace_id as expected_workspace_id. The tool and API both block on a mismatch. This sends an invitation email and may consume a billable seat, so explicit confirmation is required.

list_workspace_invitations

List pending and historical invitations for the authenticated Sanka workspace.

cancel_workspace_invitation

Cancel one pending invitation in an explicitly verified Sanka workspace. Call current_workspace immediately before this tool and pass its internal workspace_id as expected_workspace_id. The tool and API both block on a mismatch. Explicit confirmation is required.

read_binary_download_chunk

Read one base64 chunk from a large PDF download returned by a Sanka PDF download tool. Concatenate chunks in offset order, then decode the combined base64 string.

list_private_messages

Review ONLY the authenticated user private/personal account-level inbox in Sanka. Do not use for Sanka-connected Gmail integrations, workspace integration inbox, /conversation, Contact Conversation, shared inbox, group inbox, or workspace inbox; use list_workspace_messages for those.

sync_private_messages

Pull latest messages ONLY for the authenticated user private/personal account-level inbox. Do not use for Sanka-connected Gmail integrations, workspace integration inbox, /conversation, shared inbox, group inbox, or workspace inbox; use sync_workspace_messages for those.

get_private_message_thread

Load one authenticated user private/personal account-level inbox thread, including message history and reply metadata. Do not use for /conversation or shared workspace inbox threads; use get_workspace_message_thread for those.

reply_private_message_thread

Send a reply on an authenticated user private/personal account-level inbox thread in Sanka. Requires explicit user authorization for the exact reply via confirm_send=true and returns the actual sender email. If multiple distinct send-capable email addresses are connected across personal and workspace inboxes, the user must also confirm the exact sender via expected_sender_email; with one address it may be omitted. Drafting or writing a reply is not send authorization. This is not for workspace integration inbox, /conversation, shared inbox, group inbox, or workspace inbox threads.

archive_private_message_thread

Archive an authenticated user private/personal account-level inbox thread in Sanka. Do not use for /conversation or shared workspace inbox threads.

list_workspace_messages

Review shared workspace/integration inbox threads in Sanka. Prefer this for Sanka-connected Gmail, Gmail integrations, integration inbox, /conversation, Contact Conversation, shared inbox, group inbox, and workspace inbox. This is not the authenticated user private/personal inbox.

sync_workspace_messages

Pull latest shared workspace/integration inbox messages into Sanka from integration-linked channels such as Gmail. Prefer this for "Sanka-connected Gmail", Gmail integration inbox, /conversation, Contact Conversation, shared inbox, group inbox, and workspace inbox requests.

get_workspace_message_thread

Load one shared workspace/integration inbox thread from Sanka, including message history/body. Use this for /conversation, Contact Conversation, shared inbox, group inbox, workspace inbox, and integration-linked Gmail threads, not private/personal account inbox threads.

reply_workspace_message_thread

Send a reply from the shared workspace identity attached to a Sanka workspace/integration inbox thread. Requires explicit user authorization for the exact reply via confirm_send=true and returns the actual sender email. If multiple distinct send-capable email addresses are connected across personal and workspace inboxes, the user must also confirm the exact sender via expected_sender_email; with one address it may be omitted. Drafting or writing a reply is not send authorization. Use this for /conversation, Contact Conversation, shared inbox, group inbox, workspace inbox, and integration-linked Gmail threads, not private/personal inbox threads.

query_records

Query Sanka or live integration records with server-side filters and field projection. Use scope="integration" with provider="hubspot" or provider="salesforce" for provider-side rows; use this instead of list_* when the user asks for filtered rows or only a few fields.

aggregate_records

Compute counts and grouped counts for Sanka or live integration records with server-side filters. Use scope="integration" with provider="hubspot" or provider="salesforce" for provider-side counts. For “how many”, totals, or empty-field count questions, use this tool instead of paging through list_* results.

list_app_blueprint_templates

List Sanka app-builder templates such as CRM, ERP, expense management, inventory, procurement, billing, HR, IT asset management, project management, and support desk before previewing or applying a workspace blueprint.

preview_app_blueprint

Preview a Sanka workspace blueprint including side-menu modules, object schema references, permission sets, guides, flowcharts, and ER diagrams. Use template_slug for exact template matches, overlay for template + AI overlay partial matches, or blueprint_dsl for unknown generated blueprints. This does not mutate records.

apply_app_blueprint

Apply a validator-approved Sanka workspace blueprint by mutating global side-menu modules, creating missing custom objects, creating or updating permission sets, saving generated guide/Mermaid artifacts, and optionally promoting them to editable guide manuals. Requires confirm=true after explicit user approval; generated blueprints also require allow_generated_blueprint_apply=true.

preview_record_merge

Preview a Sanka-native merge plan for duplicate companies or contacts. Use after query_records mode="dedupe_candidates" and before merge_records. Returns primary/duplicate records, field resolution, related record relink plan, archive behavior, and required confirmation.

merge_records

Apply a confirmed Sanka-native merge for duplicate companies or contacts. Call preview_record_merge first, then call this only after the user explicitly approves the merge plan. Requires confirm=true.

create_custom_object_record

Create a Sanka custom object row. Set custom_object or custom_object_slug to the custom object slug/internal key or id. Use data keys as field names, internal_name values, or field UUIDs.

update_custom_object_record

Update a Sanka custom object row by row UUID. Use data keys as field names, internal_name values, or field UUIDs.

archive_custom_object_record

Archive a Sanka custom object row by row UUID. This is a soft archive, not a permanent delete.

list_associations

Review associations between Sanka records. Provide source_object/source_id or target_object/target_id; optionally filter by label_id or label.

create_association

Create an association between two Sanka records using a workspace association label. Pass label_id when known; otherwise pass label.

delete_association

Delete an association between two Sanka records. Prefer association_id; otherwise pass source_object/source_id, target_object/target_id, and label_id or label.

list_companies

Search and review companies. Default scope=sanka lists Sanka companies; scope=sanka with provider=salesforce lists Sanka companies linked to Salesforce Accounts; scope=integration with provider=salesforce lists live Salesforce Accounts; scope=integration with provider=freee or provider=moneyforward lists live accounting partners as companies.

get_company

Load one company from Sanka by company id, numeric id, or external reference.

create_company

Create or upsert a company. Default target=sanka mutates Sanka only; external_id is optional and should be used for idempotent upserts. Use target=integration with provider=salesforce to mutate Salesforce only, or target=both when the API allows both-side sync. freee/MoneyForward partner creation is handled by invoice_export, not this tool.

update_company

Update an existing company. Default target="sanka" mutates Sanka only; use target="integration" or target="both" with provider="hubspot" or provider="salesforce" when allowed. freee/MoneyForward partner updates are not supported here. For company dedupe, use operation="dedupe_preview" first; execute operation="dedupe_apply" with confirm=true only after explicit user approval.

delete_company

Archive or delete a company. Default target=sanka archives in Sanka only. Use target=integration with provider=salesforce to delete a Salesforce record by external_id, or provider=freee/provider=moneyforward to delete an accounting partner by external_id. Always run dry_run=true first and set confirm=true only after explicit approval.

get_company_price_table

Load company-level item pricing for one company. Use `search` to answer questions like "what price is item X set to for company Y?"

update_company_price_table_company

Update the company-wide price-table mode or default company percentage for one company.

update_company_price_table_item

Set or clear a company-specific price override for one item. Use `clear_override` to remove the item-specific override.

apply_company_price_table_items

Apply one company-level percentage override across all items for a company.

list_contacts

Search and review contacts in Sanka. Use this when the user wants to find or inspect contacts, not to create or update them.

get_contact

Load one contact from Sanka by contact id, numeric id, or external reference.

create_contact

Create a contact in Sanka or a connected CRM. `external_id` is optional for Sanka-local creates and should be used for idempotent upserts; integration-only creates can omit it and use the returned provider id.

update_contact

Update an existing contact in Sanka or a connected CRM.

delete_contact

Archive or delete a contact in Sanka or a connected CRM by contact id or external reference.

list_deals

Review deals. By default this lists Sanka pipeline records; use scope="integration" with provider="hubspot" or provider="salesforce" to read live CRM-side deals/opportunities from the connected channel.

get_deal

Load one deal from Sanka by case id, deal numeric id, or external reference.

create_deal

Create a deal in Sanka or a connected CRM. `external_id` is optional for Sanka-local creates and should be used for idempotent upserts; integration-only creates can omit it and use the returned provider id.

update_deal

Update an existing deal in Sanka or a connected CRM. Use `lookup_external_id` when the path identifier is not the external reference you want to resolve by.

delete_deal

Archive or delete a deal in Sanka or a connected CRM by case id, numeric id, or external reference.

list_deal_pipelines

Discover the deal pipelines and stages defined in the current workspace. Use this when the user wants to understand pipeline structure, list available stages, or describe deal positions in context.

capture_pipeline_snapshot

Capture a point-in-time pipeline snapshot from Sanka Deals or live HubSpot Deals. Use source_system="hubspot" with a connected channel_id for HubSpot snapshot demos.

list_pipeline_snapshot_batches

List captured pipeline snapshot batches. Use this before comparing snapshots when the user did not provide batch ids.

get_pipeline_snapshot_batch

Load one pipeline snapshot batch and its captured deal rows. Use this to inspect the frozen deal values behind a snapshot diff.

compare_pipeline_snapshots

Compare two pipeline snapshot batches and return amount, weighted amount, stage transition, close-date, and per-deal deltas. Omit batch ids to compare the latest two matching batches.

sync_pipeline_snapshot_hubspot_properties

Write pipeline snapshot diffs into HubSpot sanka_test_* deal properties. Defaults to dry_run=true; set dry_run=false and confirm=true only after reviewing the preview.

create_workflow

Create a Sanka workflow definition or a provider workflow by passing provider=hubspot through the same workflow endpoint. For HubSpot, dry_run defaults to true unless confirm=true.

list_sandboxes

List the sandbox linked to the current workspace (one sandbox per workspace). Each entry includes the sandbox link id, status (creating/active/refreshing/failed/deleting), the sandbox workspace code, and copy stats. Operates on the current workspace; use switch_workspace first if needed.

get_sandbox_context

Report whether the CURRENT workspace is itself a sandbox (is_sandbox, status, and the production workspace it belongs to). Call this before risky or experimental changes: if is_sandbox=true you are already in a safe copy; if false, consider creating or switching to a sandbox first.

create_sandbox

Create a sandbox copy of the current workspace configuration (objects, fields, views, pipelines, workflows arrive paused; records, integrations, and credentials are never copied). Responds 202 with status=creating; poll list_sandboxes until active. Requires an admin role and sandbox entitlement (partner plan or an override); one sandbox per workspace.

sync_sandbox_data

Copy a sample of production records into an active sandbox: per selected object, the newest 5,000 records with custom field values, line items, and associations between copied records. Additive and idempotent (re-running adds newer records without duplicating). Responds 202; progress lands in the sandbox copy_stats.

get_sandbox_diff

Compare the sandbox configuration against production per family (views, workflows, fields, pipelines, …): counts and bounded item lists for new-in-sandbox, modified-since-copy, and production-only. Use this as the checklist before re-applying tested changes to production.

refresh_sandbox

Replace everything in the sandbox with a fresh copy of current production configuration. PERMANENTLY DISCARDS all sandbox changes and copied data; the sandbox keeps its workspace code and URLs. Refreshes sit 24h apart (a never-refreshed sandbox may refresh immediately). Requires confirm=true after explicit user approval.

delete_sandbox

PERMANENTLY delete the sandbox workspace and everything in it. Production is never affected. Requires confirm=true after explicit user approval.

update_workflow

Update a Sanka workflow definition or a provider workflow by passing provider=hubspot through the same workflow endpoint. HubSpot updates require workflow_id or external_id as the HubSpot flow id.

run_workflow

Run an existing Sanka-native workflow definition. HubSpot workflow creation and updates use create_workflow/update_workflow with provider=hubspot.

resolve_record

Resolve an ambiguous user phrase such as a company, deal, or Salesforce Opportunity reference into candidate records before previewing or starting a workflow.

preview_workflow

Dry-run a supported business workflow. For deal_to_estimate, previews the Sanka estimate draft and approval state. For deal_to_order, previews creating or reusing a Sanka Order from a HubSpot Deal or synced CRM revenue record. For deal_to_subscription, previews the Order-first subscription flow and supports HubSpot batch filters such as subscription_flag_property. For estimate_to_invoice, previews creating/reusing a Sanka Order from a Sanka Estimate before invoicing. For order_to_invoice, order_to_subscription, and order_to_purchase_order, previews billing, subscription, or shortage-driven procurement creation from Sanka Orders. For subscription_to_invoice, previews invoice generation from Sanka Subscriptions, including duplicate-period checks by start_date. For deal_to_order_handoff, previews a closed-won HubSpot Deal to Sanka order draft / fulfillment handoff with customer/contact resolution, line items, inventory availability, lead-time and delivery timing, duplicate warnings, and HubSpot writeback plan. For invoice_export, previews syncing explicitly scoped Sanka invoice drafts to freee or MoneyForward invoice drafts and returns needs_confirmation for ambiguous or broad sync requests without writing records. For freee, preview/start provider capabilities and next_actions are the source of truth: freee records are cancelled/restorable rather than physically deleted, allow_resync updates mapped draft/unregistered invoices, and allow_multiple_freee_drafts creates a separate draft only with explicit user intent. Use preview/start results, not list_integration_channels shadow/outbound flags, as the source of truth for accounting export blockers. For quote_readiness, checks whether a Salesforce Opportunity has enough clean data to quote and returns blockers, warnings, fixes, source links, and the generic Sanka platform-mapping reuse/create plan. For revenue_control_summary, summarizes read-only HubSpot closed-won revenue into won, quote_drafted, approval_pending, unbilled, invoiced, unpaid, and blocked buckets with totals and next actions. For sales_incentive_commission, calculates a draft/read-only commission report by rep and deal from HubSpot closed-won deals reconciled with Sanka invoices/orders, payment status, refunds/credits, margin, ownership splits, and Sanka incentive rules. Direct CRM deal_to_invoice is disabled; create an order first. Does not write records.

start_workflow

Start a supported business workflow. For deal_to_estimate, creates a Sanka estimate draft from the deal, applies existing estimate approval rules, creates pending approval requests when required, and stops there until approval. For deal_to_order, creates or reuses a Sanka Order from a HubSpot Deal or synced CRM revenue record. For deal_to_subscription, creates/reuses the Sanka Order and then creates/updates the Subscription from that Order, including HubSpot batch lists filtered by subscription flags. For estimate_to_invoice, creates/reuses a Sanka Order from a Sanka Estimate, then creates the Invoice from that Order. For order_to_invoice, order_to_subscription, and order_to_purchase_order, starts from Sanka Order records; order_to_purchase_order creates POs only for detected inventory shortages. For subscription_to_invoice, creates invoice drafts from selected Sanka Subscription records. For deal_to_order_handoff, creates a Sanka order draft and optional fulfillment handoff task from an eligible closed-won HubSpot Deal only after explicit start/confirmation; it reruns duplicate/idempotency checks and writes HubSpot order/fulfillment status only after Sanka creation succeeds. For invoice_export, syncs only explicitly scoped Sanka invoice drafts to freee or MoneyForward invoice drafts after duplicate/idempotency checks; do not use it for an ambiguous sync-all request. For freee repeats, never tell the user to delete the freee invoice; freee supports cancellation/restoration instead. Use allow_resync=true for the mapped draft/unregistered invoice, or allow_multiple_freee_drafts=true only after explicit confirmation for a separate draft. list_integration_channels may provide accounting channel_id candidates, but its integration-sync shadow/outbound flags are not invoice_export blockers. Do not use start_workflow for quote_readiness, revenue_control_summary, or sales_incentive_commission; they are read-only preview workflows. Direct CRM deal_to_invoice is disabled.

get_workflow_run

Load a workflow run created by start_workflow, including created records, pending or completed approval history, and audit events.

preview_buy_request

Parse a natural-language purchasing intent or draft request into a Sanka Buy request preview. This tool does not create the request; use create_buy_request for writes.

list_buy_requests

List Sanka Buy requests in the authenticated workspace with optional status filtering.

create_buy_request

Create a draft Sanka Buy request with one or more request lines. Use this before sourcing products or selecting offers.

get_buy_request

Load one Sanka Buy request including lines, active offer selections, and merchant purchases.

update_buy_request

Update editable draft fields on a Sanka Buy request.

cancel_buy_request

Cancel a Sanka Buy request before downstream purchasing is complete.

source_buy_request

Start or record a sourcing run for a Sanka Buy request. provider=shopify_global_catalog searches the Shopify Global Catalog (results may be queued or unavailable until the adapter is configured). With provider=procurement_rfq, pass constraints.procurement_request_id to link an existing RFQ, or pass constraints.vendor_company_ids to originate a new RFQ and invite those vendors. Then reconcile vendor proposals with sync_buy_rfq, compare offers via get_buy_sourcing_run or get_buy_request, and continue with select_buy_offer.

sync_buy_rfq

Reconcile a Sanka Buy request with its linked procurement RFQ: ingest newly received vendor proposals into draft offer snapshots and refresh invitation state. Use this after source_buy_request with provider=procurement_rfq, and re-run it to poll for new proposals. The response is also the way to read current RFQ invitation status (invited, viewed, proposed, declined, expired, superseded); there is no separate invitation list endpoint. Compare the ingested offers with get_buy_sourcing_run or get_buy_request, then continue with select_buy_offer.

list_buy_sourcing_runs

List sourcing runs for a Sanka Buy request.

get_buy_sourcing_run

Load one Sanka Buy sourcing run by id.

select_buy_offer

Select one immutable offer snapshot per Buy request line. Multi-line and multi-merchant requests must pass line_selections so downstream merchant purchases can be split correctly. Pass acknowledge_fee=true only after the buyer explicitly accepts a quoted Cargo success fee.

preview_buy_approval

Preview whether the selected Sanka Buy offers require approval before downstream Purchase Order or checkout steps.

submit_buy_request

Submit a Sanka Buy request after line offers are selected. This may approve immediately or create approval requirements; it does not create PO/Bill/checkout records by itself.

create_buy_purchase_order

Create or reuse Sanka Company and Purchase Order records from an approved Sanka Buy request.

get_buy_merchant_purchase

Load one Sanka Buy merchant purchase, including linked Company, Purchase Order, checkout, external order, and Bill ids when present.

prepare_buy_checkout

Prepare a manual checkout URL for a Sanka Buy merchant purchase after Purchase Order creation. This does not complete payment.

confirm_buy_order

Record the user-confirmed external merchant order id after manual Sanka Buy checkout.

create_buy_bill

Create or reuse a draft Sanka Bill from a Sanka Buy merchant purchase with linked Company and Purchase Order.

preview_buy_accounting

Preview accounting export readiness for a Sanka Buy merchant purchase after Bill creation. This does not create Journal entries or accounting exports.

list_watchtower_findings

List WatchTower waste findings (upcoming renewals, vendor price creep, possibly duplicate vendors) in the authenticated workspace, with optional status and finding_type filters. Findings with buy_request_id already link to a Sanka Buy request.

update_watchtower_finding

Update the triage status of one WatchTower waste finding: confirmed to accept the signal, dismissed to reject it, or new to reopen it. The resolved status is system-managed and cannot be written.

create_buy_request_from_finding

Turn one WatchTower waste finding into a draft Sanka Buy request so the replacement purchase can be sourced and compared. Repeat calls reuse the already linked Buy request (the response reports created=false). Continue with the Sanka Buy tools (source_buy_request, select_buy_offer, submit_buy_request) afterwards.

get_watchtower_summary

Load the WatchTower spend summary for the authenticated workspace: current and previous month totals, month-over-month delta, per-source totals, a monthly trend, and category plus top-vendor breakdowns.

list_convoy_partners

List partner organizations managed in Convoy, including company, status, tier, type, and member count.

get_convoy_partner

Load one Convoy partner organization by UUID.

create_convoy_partner

Create a Convoy partner linked to an existing Sanka company or create and link a new company. This does not send an invitation; use invite_convoy_partner_member separately.

update_convoy_partner

Update selected Convoy partner profile and lifecycle fields.

archive_convoy_partner

Archive a Convoy partner after explicit approval. This preserves history and does not delete the linked Sanka company.

list_convoy_partner_members

List portal members and invitation status for one Convoy partner.

invite_convoy_partner_member

Invite a partner member to the Convoy portal. This sends email and requires explicit user approval with confirm_send=true.

resend_convoy_partner_invite

Resend a Convoy portal invitation email. Requires explicit user approval with confirm_send=true.

revoke_convoy_partner_member

Revoke a partner member invitation and portal access after explicit approval.

list_convoy_invoice_requests

List partner invoice requests and their submission, review, and payment status.

get_convoy_invoice_request

Load one Convoy invoice request with submission, review, and payment evidence.

create_convoy_invoice_request

Create one monthly invoice request for a partner. Active partner members may receive an email, so explicit approval with confirm_send=true is required.

review_convoy_invoice_request

Approve, reject, cancel, or mark a Convoy invoice request paid. Requires explicit approval with confirm=true. Marking paid records evidence only; it does not execute a bank transfer.

list_convoy_commissions

List Convoy commission calculations and approval or payment status.

get_convoy_commission

Load one Convoy commission with calculation and lifecycle details.

calculate_convoy_commissions

Preview monthly Convoy commissions by default. Set dry_run=false only after explicit approval to store draft commissions.

review_convoy_commission

Approve or mark one Convoy commission paid after explicit approval. Marking paid records status only and does not execute a bank transfer.

lookout_create_lp_batch

Queue a batch of HubSpot CMS landing-page drafts through a Lookout Motion. Configures the guarded lookout-hubspot-create-landing-page action (master-page allowlist, slug namespace, volume caps) and triggers it; the returned run stays awaiting_approval until a workspace admin approves it in the Lookout console, after which the managed executor clones the master page and PATCHes each draft. Pages are created as drafts only — publishing is a separate, always-approval-gated action. Check progress with lookout_get_run.

lookout_get_run

Inspect one Lookout Motion run: status, approval state, the triggering signal, configured action inputs, and — for executed HubSpot landing-page actions — the provider result including created page IDs and URLs.

list_items

Review items in Sanka. Use `search` to find a named item instead of query_records or broad full-list scans.

get_item

Load one item from Sanka by item id, numeric id, or external reference.

create_item

Create an item in Sanka. `external_id` is required so repeated calls can upsert safely against the same external reference.

update_item

Update an existing item in Sanka.

delete_item

Archive or delete an item in Sanka by item id or external reference.

list_orders

Search and review orders in Sanka.

get_order

Load one order from Sanka by order id, numeric id, or external reference.

download_order_pdf

Download an order from Sanka as a PDF document.

upload_order_attachment

Upload an order attachment to Sanka from an already available base64 payload. Prefer this direct upload when the client can pass content_base64 reliably. For client-local PDFs or payloads that are too large or unreliable to pass as one content_base64 string, use start_order_attachment_upload, append_order_attachment_upload_chunk until done, then finish_order_attachment_upload. Use the returned file_id in create_order or update_order.

start_order_attachment_upload

Start a chunked order attachment upload for order PDFs or attachments that are too large or unreliable to pass as one content_base64 string. Use upload_order_attachment when the client can pass content_base64 reliably. Start, append every chunk in order, then finish to receive a file_id for create_order or update_order. Do not abandon the attachment only because multiple append calls are required.

append_order_attachment_upload_chunk

Append one base64 chunk to a order attachment upload started with start_order_attachment_upload. Send the original file base64 in ordered chunks; chunk_size is the normal target, so order PDFs or attachments often complete in one append. Continue appending until the result returns done=true, then call finish_order_attachment_upload.

finish_order_attachment_upload

Finish a chunked order attachment upload after all chunks have been appended, assemble the uploaded chunks, upload the original file to Sanka, and return the file_id for create_order or update_order.

create_order

Create an order in Sanka. Provide the nested `order` payload with line items, order-level custom_fields, and optional workflow flags. Attach uploaded file ids with `attachment_file_ids` when needed.

update_order

Update an existing order in Sanka. Pass order-level custom_fields inside the nested `order` payload. Attach uploaded file ids with `attachment_file_ids` when needed.

activate_order

Restore an archived order to active status in Sanka.

delete_order

Archive an order in Sanka by order id, numeric id, or external reference. This is a soft delete; use permanent_delete_order only after explicit confirmation.

permanent_delete_order

Permanently delete an already archived order in Sanka. Requires confirm=true and cannot be undone.

list_purchase_orders

Review purchase orders in Sanka.

get_purchase_order

Load one purchase order from Sanka by purchase order id, numeric id, or external reference.

download_purchase_order_pdf

Download a purchase order from Sanka as a PDF document.

upload_purchase_order_attachment

Upload a purchase order attachment to Sanka from an already available base64 payload. Prefer this direct upload when the client can pass content_base64 reliably. For client-local PDFs or payloads that are too large or unreliable to pass as one content_base64 string, use start_purchase_order_attachment_upload, append_purchase_order_attachment_upload_chunk until done, then finish_purchase_order_attachment_upload. Use the returned file_id in create_purchase_order or update_purchase_order.

start_purchase_order_attachment_upload

Start a chunked purchase order attachment upload for purchase order PDFs or attachments that are too large or unreliable to pass as one content_base64 string. Use upload_purchase_order_attachment when the client can pass content_base64 reliably. Start, append every chunk in order, then finish to receive a file_id for create_purchase_order or update_purchase_order. Do not abandon the attachment only because multiple append calls are required.

append_purchase_order_attachment_upload_chunk

Append one base64 chunk to a purchase order attachment upload started with start_purchase_order_attachment_upload. Send the original file base64 in ordered chunks; chunk_size is the normal target, so purchase order PDFs or attachments often complete in one append. Continue appending until the result returns done=true, then call finish_purchase_order_attachment_upload.

finish_purchase_order_attachment_upload

Finish a chunked purchase order attachment upload after all chunks have been appended, assemble the uploaded chunks, upload the original file to Sanka, and return the file_id for create_purchase_order or update_purchase_order.

create_purchase_order

Create a purchase order in Sanka from explicit supplier and line item data. Attach uploaded file ids with `attachment_file_ids` when needed. For CRM deal/opportunity-sourced procurement, use deal_to_order first and create purchase orders from the Sanka Order context.

update_purchase_order

Update an existing purchase order in Sanka. Attach uploaded file ids with `attachment_file_ids` when needed.

delete_purchase_order

Delete a purchase order in Sanka by purchase order id or external reference.

list_projects

Search and review task projects in Sanka.

get_project

Load one task project from Sanka by project UUID.

create_project

Create a task project in Sanka, optionally with project-specific statuses.

update_project

Update an existing task project in Sanka, including project-specific statuses.

delete_project

Delete a task project in Sanka. Projects with linked tasks are rejected unless replacement_project_id or clear_task_project is provided.

list_ferry_diagrams

List saved Ferry migration and object-design diagrams in the current Sanka workspace.

get_ferry_diagram

Load one saved Ferry diagram, including its complete nodes, edges, viewport, and revision.

create_ferry_diagram

Create a saved Ferry migration or object-design diagram from nodes and edges.

update_ferry_diagram

Update selected fields of a Ferry diagram while preserving unspecified graph fields. Pass the revision returned by get_ferry_diagram; stale revisions are rejected.

delete_ferry_diagram

Permanently delete a saved Ferry diagram by UUID.

list_ferry_programs

List Ferry migration programs in the current Sanka workspace.

get_ferry_program

Get one Ferry migration program, including its current phases and Todos.

list_ferry_docs

List Docs (meeting updates) attached to a Ferry migration program.

create_ferry_doc

Create a Markdown Doc (meeting update) in an existing Ferry migration program.

update_ferry_doc

Update the title, date, Markdown content, pinned state, or archive state of a Ferry Doc.

create_ferry_todo

Create a Todo in an existing Ferry migration program.

batch_upsert_ferry_todos

Create or update up to 100 Ferry Todos. Every item must include id or source_ref.

update_ferry_todo

Update one Ferry Todo while preserving omitted fields.

delete_ferry_todo

Permanently delete one Todo from a Ferry migration program.

list_tasks

Search and review tasks in Sanka.

get_task

Load one task from Sanka by task id, numeric id, or external reference.

create_task

Create a task in Sanka.

update_task

Update an existing task in Sanka. When you need to append to a description, load the task first and then send the full updated description.

delete_task

Archive or delete a task in Sanka by task id or external reference.

list_contract_templates

Review uploaded Sanka Contract templates available in the current workspace.

download_contract_template

Download an uploaded Sanka Contract template. By default this returns the retained source document when available; pass source=false to download the signing PDF.

upload_contract_template

Upload a Contract template to Sanka from base64 PDF, DOC, or DOCX bytes. Word documents are converted to signing PDFs by the Sanka API and retained for later source download.

upload_contract_pdf

Upload a PDF and create a draft Sanka Contract from it.

replace_contract_pdf

Replace the PDF of an existing draft Sanka Contract. This resets document-derived signature field placements and is rejected after the draft is sent or scheduled.

create_contract_from_template

Create a draft Sanka Contract from an uploaded contract template.

get_contract_workflow_state

Load a Sanka Contract workflow state including draft metadata, signers, non-signing CC recipients, signature fields, timeline, and editability.

update_contract_metadata

Update a Sanka Contract draft name or description before sending.

save_contract_signers

Save signer rows for a Sanka Contract draft.

save_contract_recipients

Replace the complete signer and CC recipient lists for a draft Sanka Contract. Preserve signer_id when correcting an existing signer. CC recipients are non-signers and receive separate PDF copy emails.

save_contract_place_fields

Save signature field placements for a Sanka Contract draft.

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "sanka": {
            "sanka": {
                "url": "https://mcp.sanka.com/mcp"
            }
        }
    }
}

McpServers

{
    "sanka": {
        "url": "https://mcp.sanka.com/mcp"
    }
}

This repository contains the hosted Sanka MCP service and the TypeScript client it uses to call Sanka's externally callable API surface. It is now maintained as a normal TypeScript workspace, not as a Stainless-managed repository.

The production service is a remote Streamable HTTP MCP endpoint:

- POST /mcpas the primary endpoint
- POST /sseas a compatibility alias for clients that still expect an SSE-style path
- POST /as a compatibility alias
- GET /healthfor health checks

The/mcpendpoint exposes both the general SDK tools and the read-only CRM tools from a single MCP surface.

- https://mcp.sanka.com/mcp
- https://mcp.sanka.com/sse

- src/: TypeScript client for Sanka's externally callable API surface, used by the MCP service
- src/internal/: package-private SDK runtime helpers, not Sanka private backend code
- packages/mcp-server/: the MCP server application and Docker entrypoint
- .github/workflows/: CI plus staging and production Fly deployment workflows
- fly.toml: production Fly app configuration
- fly.staging.toml: staging Fly app configuration
- docs/openapi-maintenance.md: guidance for keeping API coverage current without Stainless

sanka-mcpdoes not run its own OAuth stack. It uses Sanka OAuth directly:

- Authorization server:https://app.sanka.com
- Authorization page:/oauth/authorize
- Token endpoint:/api/v1/oauth/token
- Revocation endpoint:/api/v1/oauth/revoke

For hosted or local HTTP transport, MCP clients should use native OAuth against the Sanka authorization server exposed in the protected resource metadata. The MCP server accepts only Sanka OAuth bearer tokens and validates them through:

The same bearer token is then forwarded to the Sanka public API.

Workspace reads and successfulswitch_workspacecalls refresh the resolved workspace identity held for the OAuth token or MCP session. Record URL enrichment therefore uses the selected workspace code immediately after a switch instead of retaining the code captured during the initial connection. Workflow preview/start calls also re-read the current MCP session immediately before posting, bind the request to that workspace, and fail closed if the API resolves a different workspace. This keeps accounting dry-runs and workflow writes in the same tenant shown bycurrent_workspace.

Native OAuth-capable clients such as Codex and Claude receive an MCP OAuth challenge during connection or protected tool calls. Clients that do not support native MCP OAuth can still use the protected-tool fallback, which returns a Connect Sanka URL for the user to open.

Developer API tokens are intentionally not supported for MCP access. They remain valid for direct Sanka API and SDK usage outside MCP.

pnpm install pnpm build export MCP_SERVER_AUTHORIZATION_SERVER_URL="http://app.localhost:8000" export MCP_SERVER_OAUTH_CLIENT_ID="your-public-oauth-client-id" export SANKA_BASE_URL="http://api.localhost:8000" node packages/mcp-server/dist/index.js --transport=http --port=8080

MCP_SERVER_OAUTH_CLIENT_IDis optional. When present, the server advertises that OAuthclient_idin its authorization server metadata.

- app.localhost:8000serves/oauth/authorizeand/api/v1/oauth/token
- api.localhost:8000serves/api/v2/public/
- create the OAuth app/client in Sanka first:

- first-party:/manage/oauth
- third-party:/:wsid/developers/oauth

If you want to use stdio locally instead of HTTP transport, native OAuth is not part of the stdio handshake. In that case pass an already-issued Sanka OAuth access token throughSANKA_API_KEYas a local development convenience.

curl http://127.0.0.1:8080/health curl -sS -D - http://127.0.0.1:8080/mcp \ -H 'content-type: application/json' \ -H 'accept: application/json, text/event-stream' \ --data '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"0.1"}}}'

For a native OAuth-capable MCP client, point the client athttp://127.0.0.1:8080/mcpwithout static auth headers and let the client follow the protected resource metadata to Sanka OAuth.

curl -sS -D - http://127.0.0.1:8080/mcp \ -H 'content-type: application/json' \ -H 'accept: application/json, text/event-stream' \ -H 'authorization: Bearer soat_your_access_token' \ --data '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"0.1"}}}'

Thebrowser_useMCP tool dispatches allowlisted browser workflows to a separate worker. The MCP server keeps OAuth, audit metadata, workflow routing, and confirmation gates; the worker owns browser state and third-party UI interaction. The first registered workflow is:

- demo.hubspot.company_avatar: update HubSpot demo company avatars through the HubSpot UI when CRM APIs cannot set the visible avatar.

npm install -g agent-browser agent-browser install export SANKA_BROWSER_USE_WORKER_TOKEN="local-worker-token" export SANKA_BROWSER_USE_PROFILE_ROOT=".browser-use-profiles" export SANKA_BROWSER_USE_ARTIFACT_DIR=".browser-use-artifacts" pnpm --dir packages/mcp-server browser-use-worker
export SANKA_BROWSER_USE_WORKER_URL="http://127.0.0.1:8787/run" export SANKA_BROWSER_USE_WORKER_TOKEN="local-worker-token"

Seedocs/browser-use-worker-fly.mdfor the Fly worker app, persistent volume, secret wiring, and profile seeding runbook.

This repo deploys to Fly frompackages/mcp-server/Dockerfile.

- Manual production deploy:fly deploy -c fly.toml
- Manual staging deploy:fly deploy -c fly.staging.toml
- Automatic staging deploy: push tostaging
- Automatic production deploy: publish a GitHub release that targetsmain

Use the same promotion shape as the main Sanka app:
- Open feature PRs intostaging.
- Mergestagingafter CI passes to deploysanka-mcp-staging.
- Validate the staging MCP endpoint.
- Openstaging -> main.
- Aftermainis ready, runCreate new Sanka MCP Tag and Release.
- The published release deploys production.

- Production app:sanka-mcp
- Staging app:sanka-mcp-staging
- Set the sameMCP_SERVER_
secrets on both apps unless staging intentionally uses a different auth stack.

This repository no longer depends on Stainless project access at runtime or for ongoing development. API coverage should be maintained directly in this repo.

The recommended next step is to adopt open-source OpenAPI tooling for updates to the TypeScript client, rather than reintroducing a hosted generator dependency. Seeopenapi-maintenance.md.

The repo now includes a starter typegen command:

By default it reads the sibling Sanka spec at../sanka-sdks/openapi.json.

Persistent memory for any AI assistant. Zero token cost until recall. Stores memories in local SQLite, ranks by 6-factor scoring, returns results 79% smaller than JSON. Works with Claude, ChatGPT, Grok, Cursor, Windsurf, and any MCP client.

After Effects MCP is a full-featured automation bridge that connects AI clients (like VS Code, Claude Desktop, and Claude Code) to Adobe After Effects through MCP, enabling scripted control of compositions, layers, effects, keyframes/graph easing, presets, markers, audio levels, waveform analysis, and effect discovery via a live bridge panel.

Project management your AI can actually run — connect Claude, ChatGPT, Cursor & Codex to one board over MCP.

AIOProductOS spine over MCP — customers, revenue, feedback, work, analytics on one typed record.

The memory layer for AI coding tools. Local-first, semantic, 9 MCP tools with consolidation and project scoping. Works with Claude Code, Cursor, Windsurf & any MCP client.

One MCP server for Claude, ChatGPT & Gemini — wraps your ERPs, CRMs, APIs and knowledge base into a single governed endpoint.

Run your field service business from Claude: answer calls, book and dispatch jobs, build estimates, chase invoices. Built for HVAC, plumbing, electrical, roofing and pest control.

Complete Swiss accounting integration for Bexio via MCP. Works with Claude Desktop, n8n, and any MCP client. 221 tools for invoices, contacts, projects & more.

Persistent memory MCP server for Claude Desktop — remembers context, time, and topics across sessions

An MCP extension for the Claude Desktop application that enables automation and integration.

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.