MarketSharp

io.github.WYRE-AI由 GitHub 帳號 WYRE-AI 發布v1.0.0更新於 Nov 11, 2026

MCP server for MarketSharp CRM contacts, inquiries, appointments, jobs, notes and activities.

已驗證STDIO僅桌面資料與分析商業與電商

概覽

AI 產生的概覽

唯讀的 MCP 伺服器,讓助理存取 MarketSharp CRM 的聯絡人、詢問單、預約、工單、備註與參考清單。

可以做什麼
  • 查詢公司,並跨聯絡人、詢問單、工單進行全域搜尋
  • 讀取與搜尋聯絡人,包含 QuickFind 與分頁篩選清單
  • 讀取詢問單及其狀態、備註與產品興趣
  • 讀取預約、預約結果與工單,以及含合約總額的商機清單
  • 讀取備註、活動類型、員工、潛在客戶來源與部門
適用情境
適合在助理需要回答承包商存放於 MarketSharp 的潛在客戶、預約、工單或客戶紀錄相關問題,或在不更動任何資料的前提下彙整銷售管道與商機資料時使用。
執行需求
以 stdio 在本機執行;需要 Node.js 22 以上版本,或使用已發布的容器映像。需要 MARKETSHARP_COMPANY_ID、MARKETSHARP_API_KEY 與 MARKETSHARP_API_SECRET;映像另需 MCP_TRANSPORT=stdio 與 AUTH_MODE=env。MARKETSHARP_EMPLOYEE_ID 為選用,但聯絡人、詢問單、工單搜尋工具與備註清單需要它。需能連線至 MarketSharp REST API。
安裝前請注意
需要 MarketSharp API 金鑰與密鑰,兩者皆屬機密;建議使用專為 API 存取設定的員工帳號,而非個人登入。全部 25 個工具皆為唯讀,不會建立、修改或刪除資料。工具輸出為客戶輸入的 CRM 資料,會被標示為不可信內容。部署時切勿設定 MCP_ALLOW_INSECURE_DEV。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 MarketSharp,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

marketsharp-mcp

MCP server for the MarketSharp CRM REST API (https://restapi.marketsharpm.com, API version 2.0). It gives an AI assistant read access to a home-improvement contractor's contacts, inquiries (leads), appointments, jobs, notes and reference lists. Every tool is read-only.

Maintained by WYRE AI. It runs as a stdio server locally or as a stateless Streamable HTTP server behind a gateway.

Credentials

MarketSharp uses application authentication: the server exchanges your Company ID, API key and API secret at POST /token for a short-lived bearer token, caches it per credential set, and refreshes it on expiry or a 401.

VariableGateway headerRequiredWhere to find it
MARKETSHARP_COMPANY_IDx-marketsharp-company-idyesShown under your username, top right in MarketSharp
MARKETSHARP_API_KEYx-marketsharp-api-keyyesAdmin → Apps & Add-ons Setup → API maintenance → Create New API Key
MARKETSHARP_API_SECRETx-marketsharp-api-secretyesIssued with the API key. If there's no secret, MarketSharp support has to turn on API access
MARKETSHARP_EMPLOYEE_IDx-marketsharp-employee-idnoMarketSharp employee ID. The contact, inquiry and job search tools, and marketsharp_notes_list need it, and act with that employee's permissions

Use a dedicated MarketSharp employee set up for API access rather than a person's login. The server never uses MarketSharp usernames or passwords.

Tools (25, all read-only)

ToolMarketSharp endpoint
marketsharp_companies_listGET /companies
marketsharp_companies_getGET /companies/{companyId}
marketsharp_search_globalPOST …/search/global (contacts, inquiries, jobs)
marketsharp_contacts_getGET …/contacts/{contactId}
marketsharp_contacts_searchPOST …/contacts/search (QuickFind, needs employee)
marketsharp_contacts_listPOST …/contacts/filter (paged, modified-since / appointment window)
marketsharp_inquiries_getGET …/inquiries/{inquiryId} (optional isAppointmentRequired; MarketSharp defaults it to true)
marketsharp_inquiries_listPOST …/inquiries/filter (paged; optional isAppointmentRequired, which MarketSharp defaults to true)
marketsharp_inquiries_searchPOST …/inquiries/search (QuickFind, needs employee)
marketsharp_inquiries_list_by_contactGET …/contacts/{contactId}/inquiries (optional isAppointmentRequired)
marketsharp_inquiry_statuses_listGET …/inquiries/statuses
marketsharp_inquiry_notes_listGET …/opportunities/{inquiryId}/notes/{Inquiry|Job} (needs View Opportunity Note)
marketsharp_appointments_getGET …/appointments/{appointmentId}
marketsharp_appointments_listPOST …/appointments/filter (paged)
marketsharp_appointments_list_by_contactGET …/appointments/contacts/{contactId}
marketsharp_appointment_results_listGET …/appointments/results/active or resultreasons/active
marketsharp_jobs_getGET …/jobs/{jobId}
marketsharp_jobs_searchPOST …/jobs/search (QuickFind, needs employee)
marketsharp_opportunities_listPOST …/jobs/opportunities (jobs + leads since a date, contract totals; needs View Opportunity)
marketsharp_notes_listGET …/notes/contact/{contactId} or by note type (needs employee)
marketsharp_activity_types_listGET …/activities/types
marketsharp_employees_listGET …/employees (paged)
marketsharp_lead_sources_listGET …/primaryleadsources[/…/secondaryleadsources]
marketsharp_product_interests_listGET …/products/interests/{activeOnly} or per inquiry (needs View Product Interest)
marketsharp_divisions_listGET …/divisions

There are no create, update or delete tools. Searches and filtered lists use POST because that is how MarketSharp exposes them; they don't change data. The client only sends the GET and POST routes these tools use (an allowlist of route templates in src/client.ts). Any other request, including a GET no tool uses, is refused before sign-in.

Running

Requires Node.js 22 or later.

bash
npm ci && npm run buildMARKETSHARP_COMPANY_ID=… MARKETSHARP_API_KEY=… MARKETSHARP_API_SECRET=… node dist/index.js   # stdio

The Docker image defaults to MCP_TRANSPORT=http and AUTH_MODE=gateway. To run the image over stdio with MARKETSHARP_* credentials, pass -e MCP_TRANSPORT=stdio -e AUTH_MODE=env as well; otherwise it fails closed with "credentials are not configured".

HTTP (MCP_TRANSPORT=http, /mcp + /health) refuses to start without a real CONDUIT_S2S_SECRET (at least 32 characters, not a known or placeholder-looking value, not a repeated pattern, at least 8 distinct characters) and requires a valid X-Gateway-S2S header on every /mcp request. /mcp takes POST only (405 with Allow: POST otherwise). MCP_ALLOWED_HOSTS (comma-separated, off when unset) limits the Host headers /mcp accepts. Every response sets Cache-Control: no-store.

  • AUTH_MODE is gateway (the default when unset) or env. Any other value refuses to start. In gateway mode credentials come only from the x-marketsharp-* headers; MARKETSHARP_* env is never read. env is for a single tenant and reads MARKETSHARP_* from the environment; over HTTP it refuses to start unless the company id, API key and API secret are set and the ids look like MarketSharp ids. Stdio uses the environment only when AUTH_MODE is unset or exactly env; any other value (including a typo) is treated as gateway, so env credentials are never used by mistake.
  • Tool tiers: read is the only tier. Conduit's X-Conduit-Tool-Tiers header can only narrow that set for one request. A present but empty header means no tools at all. Unlike the fleet template there is deliberately no MARKETSHARP_TOOL_TIERS variable: with one tier there is nothing to choose, and nothing in the environment can change the tier set.
  • Every request goes to the fixed host https://restapi.marketsharpm.com at exactly the path that was built. Ids in paths must look like MarketSharp ids (1-64 letters, digits or dashes, which covers numbers and GUIDs); anything else is rejected before any request. Redirects are refused (redirect: 'manual', any 3xx is an error), so the bearer token never leaves the host. Response bodies are read with a 4 MiB cap.
  • Tool output, tool errors and log lines are redacted: the API key and secret in use (env or per request), bearer tokens and JWTs become [REDACTED]. In MarketSharp responses, values under credential-named keys (apiKey, authorization, token, accessToken, refreshToken, and any key ending in password or secret) are redacted too. Arguments a tool doesn't declare are dropped before it runs. Vendor errors keep the HTTP status, MarketSharp's message and, when sent, the request id (x-request-id, request-id or x-correlation-id).
  • Page sizes and record counts above a tool's maximum are rejected, not silently lowered, so "fewer rows than rowsPerPage means the last page" stays true. Pages are passed through as given; the server never fetches more than one page per call.
  • MCP_ALLOW_INSECURE_DEV=1 lets HTTP start without a secret, on 127.0.0.1 only, and requires NODE_ENV=development. With any other NODE_ENV the server refuses to start.
  • Tool output is MarketSharp data that other people may have typed (lead forms, notes, names). Every successful result is escaped and wrapped in <untrusted-content nonce="…"> markers behind a notice telling the model not to follow instructions inside it. MarketSharp's own error text is wrapped the same way.

See .env.example. The image's health check probes /health only when MCP_TRANSPORT=http.

Limits and unknowns

  • MarketSharp doesn't publish rate limits. The server retries 429 with Retry-After or exponential backoff (3 tries). A 503 is retried only for GET requests. Searches and filtered lists (which use POST) return it instead.
  • The /token 200 response shape isn't documented. The server accepts access_token or token, top level or inside response, or a bare JWT body (plain or JSON-quoted).
  • HTTP request bodies are capped at 256 KiB (262,144 bytes). Larger bodies, declared or chunked, get a 413.
  • Responses are capped at 200,000 characters; narrow with filters or paging. An oversized list keeps whole records and its paging fields (also when the page sits under response or data), and a note says how many records were left out. On the paged lists the note names the exact pageNumber and rowsPerPage (page and pageSize for employees) that read on from the first record left out; other tools can't page, so it says to narrow with filters. A list whose first record alone is over the cap is cut as text.
  • The QuickFind searches always send numberOfRecords (default 25): it is a non-nullable int32 in the spec, and what MarketSharp does with 0 is undocumented.
  • Not covered: calendar, texting, email, PaySimple, QuickBooks, CompanyCam, automation rules, analytics, estimates (v1 only), and all admin/config writes.

Security notes

  • companyId and employeeId are identifiers, not secrets. The companies tools return them by design.
  • MCP_ALLOWED_HOSTS is opt-in defence in depth behind S2S, not an auth control. It matches the Host header's hostname and ignores the port.
  • The S2S signature covers only the timestamp, the same as the gateway's verifier. Recipient binding comes from the per-vendor subkey.
  • MCP_ALLOW_INSECURE_DEV must never be set in a deployment.
  • A request has at most 4 MarketSharp calls in flight, each counted from the start of the fetch until its response body is fully read. A large JSON-RPC batch queues instead of fanning out. A retry's wait doesn't hold a slot.

Development

bash
npm ci --ignore-scriptsnpm run typecheck        # tsc --noEmitnpm run lint             # eslint + destructive-tool warning lintnpm run lint:destructive # destructive-tool warning lint onlynpm run buildnpm test                 # vitest, no networknpm run smoke            # spawns dist/index.js over stdio, no network

evals/ holds the mcp-assert suite that CI runs against the built server.

Each release publishes ghcr.io/wyre-ai/marketsharp-mcp, and its release notes are on the GitHub Release for that version.

License

Apache-2.0

來源:README.md,提交 ce304c1

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v1.0.0最新Nov 11, 2026

評分

已滿足適用檢查項的 40%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。