ConnectWise Manage について
ConnectWise Manage の利用者向けに、MCP 対応 AI から日常的な PSA 業務を操作できる MCP サーバーです。クラウド型とセルフホスト型に対応し、チケット、企業、連絡先、プロジェクト、工数を扱います。
主な機能
- 01チケットとメモの管理
- 02企業と連絡先の検索・更新
- 03プロジェクトとプロジェクトチケットの管理
- 04工数記録の作成・修正・検索
- 05リソース時間のスケジュール
- 06クラウド型とセルフホスト型に対応
活用シーン
- 01AI でサービスチケットを検索・更新
- 02プロジェクト工数の記録と修正
- 03企業・連絡先情報の検索と管理
- 04チケットやプロジェクトのリソース時間を予約
MCP 対応
MCP 対応クライアントに、チケット、企業、連絡先、プロジェクト、工数などを操作する 84 個のツールを公開します。stdio と HTTP のトランスポートに対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
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-ai/connectwise-manage-mcp:v1.15.11CW_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 keyCW_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-hostedMCP_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 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/wyre-ai/connectwise-manage-mcp:v1.15.11stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
ConnectWise Manage MCP Server
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 のために開発しました。
ワンクリックデプロイ
レジストリ認証に関する注意: このサーバーは公開 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_ID | stdio および AUTH_MODE=env の場合 | ConnectWise の会社識別子 |
CW_MANAGE_PUBLIC_KEY | stdio および AUTH_MODE=env の場合 | API メンバーの公開キー |
CW_MANAGE_PRIVATE_KEY | stdio および AUTH_MODE=env の場合 | API メンバーの秘密キー |
CW_MANAGE_CLIENT_ID | stdio および 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_SECRET | HTTP では必須 | サービス間シークレット。この値が空、または既知のプレースホルダー(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 キーの取得
- ConnectWise Manage インスタンスにログインします
- System > Members > API Members に移動します
- 適切な権限を付与した新しい API メンバーを作成します
- メンバーの API キーを生成します
- 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は無効で、タイプは子コレクションであるため 400ApiFindConditionが返されます。このツールは該当する条件句を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
貢献
- リポジトリをフォークします
- 機能ブランチを作成します(
git checkout -b feature/amazing-feature) - 変更をコミットします(
git commit -m 'Add amazing feature') - ブランチにプッシュします(
git push origin feature/amazing-feature) - プルリクエストを作成します
ライセンス
Apache-2.0
WYRE Technology が開発 — MSP Claude Plugins エコシステムの一部
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。