mcpField
C
ConnectWise Manage

ConnectWise Manage

ローカル
github.comビジネス・マーケティング301 週間前に更新

ConnectWise Manage について

ConnectWise Manage の利用者向けに、MCP 対応 AI から日常的な PSA 業務を操作できる MCP サーバーです。クラウド型とセルフホスト型に対応し、チケット、企業、連絡先、プロジェクト、工数を扱います。

主な機能

  1. 01チケットとメモの管理
  2. 02企業と連絡先の検索・更新
  3. 03プロジェクトとプロジェクトチケットの管理
  4. 04工数記録の作成・修正・検索
  5. 05リソース時間のスケジュール
  6. 06クラウド型とセルフホスト型に対応

活用シーン

  1. 01AI でサービスチケットを検索・更新
  2. 02プロジェクト工数の記録と修正
  3. 03企業・連絡先情報の検索と管理
  4. 04チケットやプロジェクトのリソース時間を予約

MCP 対応

MCP 対応クライアントに、チケット、企業、連絡先、プロジェクト、工数などを操作する 84 個のツールを公開します。stdio と HTTP のトランスポートに対応します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"wyre-technology-connectwise-manage": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"CW_MANAGE_COMPANY_ID",
"-e",
"CW_MANAGE_PUBLIC_KEY",
"-e",
"CW_MANAGE_PRIVATE_KEY",
"-e",
"CW_MANAGE_CLIENT_ID",
"-e",
"CW_MANAGE_URL",
"-e",
"MCP_TRANSPORT",
"-e",
"AUTH_MODE",
"-e",
"LOG_LEVEL",
"ghcr.io/wyre-technology/connectwise-manage-mcp:v1.8.6"
],
"env": {
"CW_MANAGE_COMPANY_ID": "<CW_MANAGE_COMPANY_ID>",
"CW_MANAGE_PUBLIC_KEY": "<CW_MANAGE_PUBLIC_KEY>",
"CW_MANAGE_PRIVATE_KEY": "<CW_MANAGE_PRIVATE_KEY>",
"CW_MANAGE_CLIENT_ID": "<CW_MANAGE_CLIENT_ID>",
"CW_MANAGE_URL": "<CW_MANAGE_URL>",
"MCP_TRANSPORT": "<MCP_TRANSPORT>",
"AUTH_MODE": "<AUTH_MODE>",
"LOG_LEVEL": "<LOG_LEVEL>"
}
}
}
}
起動コマンドdocker run -i --rm -e CW_MANAGE_COMPANY_ID -e CW_MANAGE_PUBLIC_KEY -e CW_MANAGE_PRIVATE_KEY -e CW_MANAGE_CLIENT_ID -e CW_MANAGE_URL -e MCP_TRANSPORT -e AUTH_MODE -e LOG_LEVEL ghcr.io/wyre-technology/connectwise-manage-mcp:v1.8.6
設定が必要な環境変数
CW_MANAGE_COMPANY_IDConnectWise company identifier (the short name used to log in)
CW_MANAGE_PUBLIC_KEYシークレットConnectWise API member public key (Members > API Members)
CW_MANAGE_PRIVATE_KEYシークレットConnectWise API member private key
CW_MANAGE_CLIENT_IDシークレットClient ID from the ConnectWise Developer Portal (developer.connectwise.com)
CW_MANAGE_URLConnectWise API base URL — region-specific (api-na/eu/au.myconnectwise.net) or self-hosted
MCP_TRANSPORTTransport mode for the server. Set to 'stdio' for local CLI use; the image defaults to 'http' for gateway hosting.
AUTH_MODEシークレットCredential source: 'env' reads vars locally, 'gateway' expects header injection from the WYRE MCP Gateway.
LOG_LEVELLog verbosity: debug, info, warn, error

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
ocighcr.io/wyre-technology/connectwise-manage-mcp:v1.8.6

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

ConnectWise Manage MCP Server

License Node.js

AI アシスタントが ConnectWise Manage を直接操作できます。 CWM のインターフェースをクリックして操作する代わりに、自然な会話を通じてチケットの検索、作業時間の記録、会社や連絡先の確認、プロジェクトの管理を行えます。

これは、Claude(または MCP 互換の AI)に、ConnectWise Manage を利用する企業の日常業務を網羅する 84 個のツールを提供する Model Context Protocol (MCP) サーバーです。クラウドホスト型とセルフホスト型のどちらの CWM インスタンスにも対応しており、サーバーを指定するだけで利用できます。

MSP Claude Plugins エコシステムの一部です — Autotask、Datto RMM、IT Glue、HaloPSA、NinjaOne、Huntress など、MSP の技術基盤向け AI 統合を拡充するエコシステムです。MSP が MSP のために開発しました。

ワンクリックデプロイ

Deploy to DO

Deploy to Cloudflare Workers

レジストリ認証に関する注意: このサーバーは公開 npm パッケージのみに依存しているため、Cloudflare と DigitalOcean のクラウドビルダーは匿名で依存関係をインストールします。ワンクリックデプロイにトークンは不要です。(今後のリリースで非公開の @wyre-ai/* 依存関係が追加された場合は、ビルド変数として read:packages 権限を持つ GitHub PAT を指定します。Cloudflare Workers では NODE_AUTH_TOKEN、DigitalOcean ではビルド時の GITHUB_TOKEN シークレットを使用します。)

公開済みパッケージのインストール: リリース済みパッケージは GitHub Packages npm レジストリに公開されています。このレジストリでは、公開パッケージであってもインストールのたびに認証が必要です。インストールするには、read:packages 権限を持つ GitHub PAT を使用して、npm を npm.pkg.github.com に対して認証してください。

export NODE_AUTH_TOKEN=$(gh auth token)
npm install @wyre-ai/connectwise-manage-mcp

Entra ID OAuth 2.1 を使用して Azure Container Apps にデプロイする方法については、AZURE_ACA_DEPLOYMENT.md を参照してください。

設定

環境変数
変数必須説明
CW_MANAGE_COMPANY_IDstdio および AUTH_MODE=env の場合ConnectWise の会社識別子
CW_MANAGE_PUBLIC_KEYstdio および AUTH_MODE=env の場合API メンバーの公開キー
CW_MANAGE_PRIVATE_KEYstdio および AUTH_MODE=env の場合API メンバーの秘密キー
CW_MANAGE_CLIENT_IDstdio および AUTH_MODE=env の場合ConnectWise Developer Portal のクライアント ID
CW_MANAGE_URLいいえAPI のベース URL(下記参照)
CW_MANAGE_REJECT_UNAUTHORIZEDいいえ自己署名証明書を使用する場合は false に設定します(デフォルト:true)
MCP_TRANSPORTいいえstdio(デフォルト)または http
MCP_HTTP_PORTいいえHTTP ポート(デフォルト:8080)
MCP_HTTP_HOSTいいえMCP_TRANSPORT=http の場合のバインドアドレス。デフォルトは 127.0.0.1 です。CONDUIT_S2S_SECRET が設定されている場合は、この値が適用されます。コンテナーイメージでは 0.0.0.0 が設定されます。
CONDUIT_S2S_SECRETHTTP では必須サービス間シークレット。この値が空、または既知のプレースホルダー(changeme、secret、your-s2s-secret、replace-me など)の場合、HTTP サーバーはエラーをログに記録して、ゼロ以外の終了コードで終了します。未設定の場合、Compose は起動しません。実際の値をコミットしないでください。.env.example では空のままにしてください。
MCP_ALLOW_INSECURE_DEVいいえCONDUIT_S2S_SECRET なしで HTTP を起動する場合に限り、ローカル開発用として 1 に設定します。プロセスは警告をログに記録し、X-Gateway-S2S を要求せず、127.0.0.1 のみでリッスンします(より広い範囲の MCP_HTTP_HOST は上書きされます)。プレースホルダーのシークレットは引き続き拒否されます。
AUTH_MODEいいえenv(デフォルト)または gateway。ゲートウェイモードでは、各 /mcp リクエストに X-CW-Company-Id、X-CW-Public-Key、X-CW-Private-Key、X-CW-Client-Id が必要です。env では、S2S 認証の成功後に CW_MANAGE_* を使用します。

/health は認証不要のままで、ConnectWise の認証情報を読み取りません。stdio トランスポートでは CONDUIT_S2S_SECRET を使用しません。

HTTP 認証

MCP_TRANSPORT=http で CONDUIT_S2S_SECRET が設定されている場合、すべての /mcp リクエストに X-Gateway-S2S を含める必要があります。ヘッダー値は次のとおりです。

t=<unix seconds>,v1=<hex hmac-sha256>

v1 は、ASCII 文字列 t=<unix seconds> をキー CONDUIT_S2S_SECRET で署名した HMAC-SHA256(16 進数、小文字)です。タイムスタンプはサーバーの時計との差が 300 秒以内でなければなりません。ヘッダーがない場合、または無効な場合は 401 を返します。プロセスがシークレットをログに書き込むことはありません。

X-Gateway-S2S: t=1710000000,v1=<hmac-sha256("t=1710000000")>

AUTH_MODE=gateway の場合、/mcp には X-CW-Company-Id、X-CW-Public-Key、X-CW-Private-Key、X-CW-Client-Id も必要です(X-CW-URL は任意です)。これらのヘッダーがリクエストの認証情報として使用されます。必須ヘッダーが欠けているリクエストには 401 を返します。

Entra OAuth のディスカバリールートは、MCP_OAUTH_ENABLED=true の場合に引き続き利用できます。シークレットが設定されている場合、POST /mcp には有効な X-Gateway-S2S ヘッダーが引き続き必要です。

API ベース URL(CW_MANAGE_URL)
インスタンスタイプURL
クラウド(北米)https://api-na.myconnectwise.net(デフォルト)
クラウド(ヨーロッパ)https://api-eu.myconnectwise.net
クラウド(オーストラリア)https://api-au.myconnectwise.net
セルフホストhttps://cwm.yourcompany.com

セルフホストのインスタンスでは、CW_MANAGE_URL にサーバーのベース URL を設定します。URL にこのパスがすでに含まれていない限り、サーバーは自動的に /v4_6_release/apis/3.0 を追加します。

セルフホストのインスタンスで自己署名証明書を使用している場合は、CW_MANAGE_REJECT_UNAUTHORIZED=false も設定してください。

API キーの取得
  1. ConnectWise Manage インスタンスにログインします
  2. System > Members > API Members に移動します
  3. 適切な権限を付与した新しい API メンバーを作成します
  4. メンバーの API キーを生成します
  5. ConnectWise Developer Portal からクライアント ID を取得します

利用可能なツール

インタラクティブなチケットカード(MCP Apps)

cw_get_ticket は、MCP Apps ホスト(Claude Desktop/web)でインタラクティブなカードとして表示されます。カード内の「Add note」から cw_add_ticket_note を呼び出す一連の処理では、常に内部専用(internalAnalysisFlag)のメモが投稿されます。他のホストでは、プレーンな JSON の動作に変更はありません。カードはデフォルトではニュートラルなデザインで、window.__BRAND__ の注入または MCP_BRAND_* 環境変数(MCP_BRAND_NAME、MCP_BRAND_LOGO_URL、MCP_BRAND_PRIMARY_COLOR、MCP_BRAND_ACCENT_COLOR、MCP_BRAND_BG、MCP_BRAND_TEXT)でブランドに合わせて変更できます。再ビルドは不要です。

チケット
  • cw_search_tickets — 条件を指定してサービスチケットを検索します
  • cw_get_ticket — ID でチケットを取得します
  • cw_get_ticket_configurations — サービスチケットに関連付けられた構成参照を一覧表示します(ページ分割)
  • cw_update_ticket_configurations — 順序付きバッチでチケット構成の関連付けを追加または削除し、すべての結果を報告します
  • cw_create_ticket — 新しいサービスチケットを作成します。省略可能な parentTicketId(cw_get_ticket が返すものと同じフィールド)を指定すると、その親チケットの子チケットとして作成されます。
  • cw_update_ticket — チケットを更新します(JSON Patch)
  • cw_get_ticket_notes — チケットのすべてのメモを取得します(子チケットのメモを含む)
  • cw_add_ticket_note — チケットにメモを追加します(ディスカッション、内部、または解決)。processNotifications が true でない限り、メールは送信されません。 emailContactFlag、emailResourceFlag、emailCcFlag、emailCc は ServiceNote のフィールドではないため、送信されません(これらを投稿すると ConnectWise で 400 エラーになります)。フラグを true にすると、processNotifications のみが有効になります。宛先は、チケットの automaticEmailContactFlag、automaticEmailResourceFlag、automaticEmailCcFlag、automaticEmailCc から決まります。省略可能な memberId は member.id として送信され、作成者に設定されます。省略すると、Manage によって API メンバーがメモの作成者として割り当てられます。作成レスポンスの internalFlag / externalFlag は保存されたメモタイプに基づいて報告されるため、内部メモが外部メモとしても報告されることはありません。
企業
  • cw_search_companies — 企業を検索します
  • cw_get_company — ID で企業を取得します
  • cw_create_company — 新しい企業を作成します
  • cw_update_company — 企業を更新します(JSON Patch)
連絡先
  • cw_search_contacts — 連絡先を検索します。typeName、typeId、または childConditions(例:types/name = "Primary")で連絡先タイプを絞り込めます。conditions 内の types / types/name は無効で、タイプは子コレクションであるため 400 ApiFindCondition が返されます。このツールは該当する条件句を childConditions に移します。連絡先のフィールドは name ではなく firstName と lastName です。文字列値には二重引用符を使用します(firstName = "Ada")。一重引用符も受け付けられ、書き換えられます。
  • cw_get_contact — ID で連絡先を取得します
  • cw_create_contact — 新しい連絡先を作成します。通信タイプ名はテナントによって異なるため、「Email」/「Direct」と決めつけず、GET /company/communicationTypes からメールと電話のタイプを解決します(emailFlag / phoneFlag、接続ごとに 10 分間キャッシュ)。省略可能な emailTypeId、emailTypeName、phoneTypeId、phoneTypeName で検索結果を上書きできます(ID は名前より優先されます。不明な名前を指定すると、利用可能なタイプが一覧表示されます)。
  • cw_list_communication_types — テナントの通信タイプ(GET /company/communicationTypes)を一覧表示し、cw_create_contact と cw_update_contact で使用する ID を確認します
  • cw_update_contact — 連絡先を更新します(PATCH /company/contacts/{id} に対する JSON Patch)。パスには firstName、lastName、title、inactiveFlag、site、communicationItems(メールと電話。タイプ名はテナントによって異なるため、cw_list_communication_types の type: { id } を使用します)、customFields が含まれます。このパッチでは連絡先タイプは扱いません。
  • cw_update_contact_types — 「Decision Maker」などの連絡先タイプを追加または削除します(POST / DELETE /company/contacts/{id}/typeAssociations)。連絡先がすでに持っているタイプを追加しても、重複は作成されません。
Projects
  • cw_search_projects — プロジェクトを検索
  • cw_get_project — IDでプロジェクトを取得
  • cw_create_project — 新しいプロジェクトを作成
  • cw_search_project_tickets — プロジェクト内のチケットを検索
  • cw_get_project_ticket — IDで特定のプロジェクトチケットを取得
  • cw_get_project_ticket_notes — プロジェクトチケットのすべてのノートを取得(子チケットのノートを含む)
  • cw_add_project_ticket_note — プロジェクトチケットにノートを追加(ディスカッション、内部向け、または解決)。メールフラグは送信されません。任意の memberId を指定すると、作成者が設定されます(member.id)。
Time Entries
  • cw_search_time_entries — 作業時間エントリーを検索
  • cw_get_time_entry — IDで作業時間エントリーを取得
  • cw_create_time_entry — 新しい作業時間エントリーを作成。ConnectWiseは作成時にエントリーの emailContactFlag、emailResourceFlag、emailCcFlag を無視し、代わりにチケットの automaticEmail* フラグをコピーします。サービスチケットとプロジェクトチケットでは、各メールフラグが false(デフォルト)のままの場合、作成時に対応するチケットフラグをオフにし、その後元に戻します。この切り替えに失敗した場合、エントリーは作成されません。suppressTicketAutoEmail: false を指定すると、切り替えがオフになります。ノート、作業時間エントリー、顧客へのメールを参照してください。
  • cw_update_time_entry — 作業時間エントリーを修正(PATCH /time/entries/{id} でのJSON Patch)。従量制契約で actualHours が0.25に丸められた場合の修正に使用します。
  • cw_delete_time_entry — 作業時間エントリーを削除(DELETE /time/entries/{id})。Manageでは、すでに請求済みのエントリーは削除できません。
Schedule Entries
  • cw_search_schedule_entries — 予約済みのリソース作業時間を検索
  • cw_list_schedule_types — スケジュールの種類を一覧表示(Service、Project、Sales、Meeting)
  • cw_list_schedule_statuses — スケジュールのステータスを一覧表示(Tentative、Firm)
  • cw_create_schedule_entry — チケット、アクティビティ、またはプロジェクトチケットにリソース作業時間を予約
  • cw_update_schedule_entry — スケジュールエントリーを更新(JSON Patch)
Members
  • cw_search_members — メンバー/技術者を検索
  • cw_get_member — IDでメンバーを取得
Configuration Items
  • cw_search_configurations — 構成アイテム(資産)を検索
  • cw_get_configuration — IDで構成アイテムを取得
Service Reference Data
  • cw_list_boards — サービスボードを一覧表示
  • cw_list_priorities — チケットの優先度を一覧表示
  • cw_list_statuses — ボードのステータスを一覧表示
Activities
  • cw_search_activities — アクティビティを検索
  • cw_get_activity — IDでアクティビティを取得
  • cw_create_activity — 新しいアクティビティを作成
Agreements
  • cw_search_agreements — 契約を検索
  • cw_get_agreement — IDで契約を取得
  • cw_get_agreement_additions — 契約の追加項目(明細項目)を取得
  • cw_update_agreement_addition — JSON Patchで追加項目を更新(quantity、effectiveDate、cancelledDate、billCustomerなど)。書き込みを行わない dryRun プレビューに対応
  • cw_create_agreement_addition — 契約に新しい追加項目を作成
  • cw_search_agreement_recaps — 契約の請求サマリーを検索(使用済み、残量、超過分、次回請求書)
  • cw_get_agreement_recap — 1件の契約の請求サマリーを取得
請求書
  • cw_search_invoices — 請求書を検索します(CW の conditions、orderBy。例:id desc)
  • cw_get_invoice — ID で請求書を取得します
  • cw_update_invoice — JSON Patch で請求書を 1 件更新します(PATCH /finance/invoices/{id})。cw_get_invoice と同じ形式で更新後の請求書を返します。許可されるパス(先頭のスラッシュは省略可):status/id または status({ id })、attention、dueDate、date、reference、customerPO、internalNotes、billToCompany、billingSite(それぞれ { id } または /id 経由。Manage の billingSite の別名として billToSite も使用できます)。Manage の請求書には billToContact フィールドがありません。連絡先の名前には attention を使用してください。カスタムフィールドと支払いフィールドは、Manage への呼び出し前に拒否されます。dryRun: true の場合は請求書を GET し、メモリ上でパッチを適用して、書き込みを行わずに { dryRun: true, saved: false, preview } を返します。一括処理モードはありません。ID ごとにループし(同時実行数 3~5)、請求書ごとに結果を報告してください。請求ステータス名は、先に ID に解決してください。ID を推測してはいけません。Manage の 400/401/403/404/409 エラーはそのまま返されます。429 は 1 回再試行され、5xx はすべての操作が replace の場合に限り 1 回再試行されます(add または remove を含む PATCH は、429 の場合のみ再試行されます)。API メンバーのロールに Finance › Invoices: Edit が必要です。
調達
  • cw_search_purchase_orders — 購買注文を検索します
  • cw_get_purchase_order — ID で購買注文を取得します
  • cw_get_purchase_order_items — 購買注文の明細項目を取得します
  • cw_search_procurement_products — 調達製品項目を検索します(チケット、プロジェクト、注文、または商談に登録された SKU)
  • cw_get_procurement_product — ID で調達製品項目を取得します
販売注文
  • cw_search_sales_orders — 販売注文を検索します
  • cw_get_sales_order — ID で販売注文を取得します
  • cw_get_sales_order_products — 販売注文の製品項目を取得します
商談
  • cw_search_opportunities — 商談を検索します
  • cw_get_opportunity — ID で商談を取得します
  • cw_search_opportunity_forecasts — 商談の予測明細を検索します
  • cw_search_opportunity_notes — 商談のメモを検索します
  • cw_search_sales_stages — 販売パイプラインのステージを一覧表示します
カタログ(製品)
  • cw_search_catalog_items — 製品カタログ項目を検索します
  • cw_get_catalog_item — ID でカタログ項目を取得します
  • cw_create_catalog_item — 新しいカタログ項目を作成します
  • cw_update_catalog_item — カタログ項目を更新します(JSON Patch)
  • cw_list_catalog_categories — カタログのカテゴリーを一覧表示します
  • cw_list_catalog_subcategories — カタログのサブカテゴリーを一覧表示します
  • cw_list_manufacturers — メーカーを一覧表示します
調達在庫

倉庫在庫と在庫調整です。API 経由で手持ち数量を変更する方法としてサポートされているのは、調整のみです。ヘッダーを作成し、明細を追加してから、調整をクローズして計上します。

  • cw_list_warehouses — 在庫倉庫を一覧表示します
  • cw_list_warehouse_bins — 倉庫の棚番を一覧表示します。倉庫を 1 つ指定することもできます
  • cw_get_inventory_on_hand — 棚番ごとに手持ち数量がゼロではないすべての項目を、マイナス分も含めて、単価と拡張金額とともに報告します
  • cw_list_adjustment_types — 在庫調整タイプを一覧表示します
  • cw_create_adjustment — 調整ヘッダーを作成します(在庫は移動しません)
  • cw_add_adjustment_detail — シリアル管理対象の項目ではシリアル番号を指定して、符号付きの調整明細を 1 件追加します
  • cw_get_adjustment — すべての明細行を含む調整ヘッダーを取得します
  • cw_close_adjustment — 調整を計上します。逆仕訳調整を除き、取り消しできません

これらを使用する前に知っておくべき ConnectWise API の制限が 2 つあります。調整には summary フィールドがありません。自由記述フィールドは reason(最大 100 文字)と notes です。また、平均原価を公開するエンドポイントはありません。そのため、cw_get_inventory_on_hand が報告する unitCost は、加重平均原価ではなく、ConnectWise が在庫評価に用いる基準原価であるカタログ項目自体の cost フィールドです。

ヘルス
  • cw_test_connection — 接続をテストします(/system/info にアクセスします)
メモ、時間記録、顧客へのメール
  • チケットによってメールの送信先が決まります。 ConnectWise は、チケットの自動メールフラグ(automaticEmailContactFlag、automaticEmailResourceFlag、automaticEmailCcFlag)と automaticEmailCc アドレスで設定された受信者にメールを送信します。
  • タイムエントリー。 ConnectWise には、これらのメールに対するエントリー単位の上書き設定がありません。作成時に、エントリーの emailContactFlag、emailResourceFlag、emailCcFlag は無視され、チケットのフラグが新しいエントリーにコピーされ、それに従ってメールが送信されます。受信者をメールから除外するため、cw_create_time_entry は作成の瞬間だけ該当するチケットのフラグをオフにし、その後オンに戻します。これは、チケットのフラグがオンで、エントリー側のフラグが false(デフォルト)の場合に、各フラグについて実行されます。
    • チケットを読み取れない場合、またはフラグをオフにできない場合(たとえば、API メンバーにチケットの編集権限がない場合)、エントリーは作成されません。
    • フラグをオンに戻す処理は、最大 3 回まで再試行されます。間隔は 200 ms、続いて 600 ms です。これにより、一時的な ConnectWise エラーでフラグがオフのままになることを防ぎます。
    • エントリーの作成後にすべての試行が失敗した場合でも、エントリーが存在し、再作成してはならないため、結果はエラーではありません(エラー結果は再試行を促し、タイムエントリーが二重に記録されるためです)。最初の内容項目は、タイムエントリーが作成済みであることを ID とともに示す WARNING です。その後、オフのままになったチケットフラグが 1 行ずつ続きます。次にエントリーの JSON が続きます。最後の項目は JSON ステータスブロックで、timeEntryCreated: true、timeEntryId、autoEmailRestoreFailed: true、ticketId、flagsLeftOff、restoreAttempts、restoreWith が含まれます。フラグがオンに戻るまで(プロジェクトチケットの場合は cw_update_ticket または PATCH /project/tickets/{id})、ConnectWise はそのチケットの該当する受信者に自動メールを送信しません。
    • サーバーは、チケット ID とパス、flagsLeftOff、timeEntryCreated、timeEntryId、試行回数、接続 ID(API ベース URL + 会社 ID)、サニタイズ済みの ConnectWise エラー(ステータスと参照 ID)を含む、エラーレベルの JSON 1 行("event":"cw_time_entry_auto_email_restore_failed")を stderr にも書き込みます。キーや認証情報が含まれることはありません。
    • 作成自体が失敗し、復元にも失敗した場合、作成に失敗したか確認できなかった旨(POST はエラーの前に ConnectWise に到達している可能性があるため、再試行する前に ConnectWise でエントリーを確認してください)と、オフのままのフラグを示すエラーが結果として返されます。同じログ行も timeEntryCreated: false(作成が確認されていないことを意味します)で書き込まれます。フラグをオフにする処理が途中で失敗して元に戻す必要がある場合も、同じ再試行とログが適用されます。
    • 同じチケットに対する cw_create_time_entry の同時呼び出しは、ConnectWise 接続(API ベース URL + 会社 ID)とチケットをキーとして、一度に 1 件ずつキューに入れられます(読み取り、切り替え、POST、復元)。このロックはプロセス内でのみ有効です。 1 つの stdio サーバー、1 つの Node HTTP サーバー、または 1 つの Worker isolate 内での並列呼び出しが対象です。レプリカ間、別々の Worker isolate 間、または同じチケットを編集する他のツールやユーザーとの調整は行われないため、この処理中に別の場所から作成すると、そのメールが送信される可能性があります。異なるチケットの作成は引き続き並列で実行されます。同じチケットに対する同時作成があり得る場合は、HTTP サーバーを単一レプリカで実行してください(例:Conduit のサイドカーでデプロイされるように Azure Container Apps を minReplicas = maxReplicas = 1 に設定します)。レプリカが複数ある場合、またはリクエストが別々の isolate に到達する可能性がある Cloudflare Workers では、同じチケットに対する 2 件の作成が交差して、一方がもう一方によってフラグがオンに戻された後にエントリーを送信することがあり(その場合、その受信者にメールが送信されます)、または一方がもう一方の「オフ」の状態を元の状態として読み取り、フラグをオフのままにする可能性があります。
    • この短い処理中は、同じチケットに記録された他のエントリーも自動メールが送信されません。チケットへの PATCH はチケットの lastUpdated も更新し、チケット更新のワークフロールールを発動させる可能性があります。
    • suppressTicketAutoEmail: false を渡すと、切り替えをスキップして ConnectWise のデフォルト動作を維持します。チャージコードまたはアクティビティに計上されるエントリーは、チケットに触れません。
  • メモ。 チケットメモのメールが送信されるのは、メモの processNotifications が true で、かつ対応するチケットの自動メールフラグがオンの場合のみです。cw_add_ticket_note は、emailContactFlag、emailResourceFlag、emailCcFlag のいずれかに true を渡すと processNotifications を設定します。ただし、processNotifications を自分で設定した場合は除きます。これらのフラグ名がメモ自体に POST されることはありません。
  • メモ単位の受信者設定はありません。 ConnectWise のメモ API では、個々のメモに受信者や CC アドレスを指定できません。メモのメール送信先を変更するには、メモを追加する前にチケットの自動メールフラグと automaticEmailCc を変更します(たとえば、cw_update_ticket を使用します)。

使用方法

Claude Desktop での使用

claude_desktop_config.json に追加します。

{
  "mcpServers": {
    "connectwise-manage": {
      "command": "npx",
      "args": ["@wyre-ai/connectwise-manage-mcp"],
      "env": {
        "CW_MANAGE_COMPANY_ID": "your-company-id",
        "CW_MANAGE_PUBLIC_KEY": "your-public-key",
        "CW_MANAGE_PRIVATE_KEY": "your-private-key",
        "CW_MANAGE_CLIENT_ID": "your-client-id"
      }
    }
  }
}

セルフホスト型インスタンスの場合:

{
  "mcpServers": {
    "connectwise-manage": {
      "command": "npx",
      "args": ["@wyre-ai/connectwise-manage-mcp"],
      "env": {
        "CW_MANAGE_URL": "https://cwm.yourcompany.com",
        "CW_MANAGE_COMPANY_ID": "your-company-id",
        "CW_MANAGE_PUBLIC_KEY": "your-public-key",
        "CW_MANAGE_PRIVATE_KEY": "your-private-key",
        "CW_MANAGE_CLIENT_ID": "your-client-id",
        "CW_MANAGE_REJECT_UNAUTHORIZED": "false"
      }
    }
  }
}
Docker での使用

リポジトリに含まれる Compose サービスはゲートウェイモードです。CW_MANAGE_* は設定されず、env_file も使用しないため、プロジェクトの .env から静的なベンダー認証情報をコンテナに渡すことはできません。ただし、Compose はこのファイルから CONDUIT_S2S_SECRET と LOG_LEVEL を補間します。イメージはコンテナ内の 0.0.0.0 でリッスンし、公開ポートはループバックにバインドされます。

CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" docker compose up -d

openssl rand -hex 32 でシークレットを生成します。CONDUIT_S2S_SECRET が設定されていない場合、Compose は起動しません。すべての /mcp リクエストには、X-Gateway-S2S(HTTP 認証を参照)と X-CW-* 認証情報ヘッダーを含める必要があります。

シングルテナント HTTP(AUTH_MODE=env)でも S2S シークレットが必要で、その後 CW_MANAGE_* が使用されます。

docker run \
  -e CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" \
  -e AUTH_MODE=env \
  -e CW_MANAGE_COMPANY_ID=your-company-id \
  -e CW_MANAGE_PUBLIC_KEY=your-public-key \
  -e CW_MANAGE_PRIVATE_KEY=your-private-key \
  -e CW_MANAGE_CLIENT_ID=your-client-id \
  -p 127.0.0.1:8080:8080 \
  ghcr.io/wyre-ai/connectwise-manage-mcp:latest

docker-compose.caddy.yml は、Caddy の背後に配置するシングルテナント構成です。こちらも CONDUIT_S2S_SECRET が必要です。

HTTP トランスポート(ゲートウェイモード)

マルチテナントのゲートウェイ環境では、HTTP トランスポートで実行します。CONDUIT_S2S_SECRET が設定されるまでプロセスは終了します。

CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" MCP_TRANSPORT=http AUTH_MODE=gateway node dist/index.js

各 /mcp リクエストには、有効な X-Gateway-S2S ヘッダーに加え、X-CW-Company-Id、X-CW-Public-Key、X-CW-Private-Key、X-CW-Client-Id が必要です(X-CW-URL は任意です)。

シークレットなしのローカル HTTP は開発専用です。127.0.0.1 にバインドされ、警告がログに記録されます。

MCP_TRANSPORT=http MCP_ALLOW_INSECURE_DEV=1 npm start

開発

# Install dependencies
npm install

# Build
npm run build

# Run in development (stdio)
npm run dev

# HTTP refuses to start until CONDUIT_S2S_SECRET is set
CONDUIT_S2S_SECRET="$CONDUIT_S2S_SECRET" MCP_TRANSPORT=http npm start

# Local HTTP only, without a service-to-service secret (always binds 127.0.0.1)
MCP_TRANSPORT=http MCP_ALLOW_INSECURE_DEV=1 npm start

# Type check
npm run typecheck

# Run tests
npm test

貢献

  1. リポジトリをフォークします
  2. 機能ブランチを作成します(git checkout -b feature/amazing-feature)
  3. 変更をコミットします(git commit -m 'Add amazing feature')
  4. ブランチにプッシュします(git push origin feature/amazing-feature)
  5. プルリクエストを作成します

ライセンス

Apache-2.0


WYRE Technology が開発 — MSP Claude Plugins エコシステムの一部

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。