sipgate-mcp 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/README.md +125 -34
- package/SKILL.md +87 -0
- package/dist/backend/access-controlled-backend.d.ts +57 -0
- package/dist/backend/access-controlled-backend.d.ts.map +1 -0
- package/dist/backend/access-controlled-backend.js +227 -0
- package/dist/backend/access-controlled-backend.js.map +1 -0
- package/dist/backend/sipgate-backend.d.ts +13 -1
- package/dist/backend/sipgate-backend.d.ts.map +1 -1
- package/dist/backend/sipgate-backend.js +101 -10
- package/dist/backend/sipgate-backend.js.map +1 -1
- package/dist/backend/telephony-backend.d.ts +16 -0
- package/dist/backend/telephony-backend.d.ts.map +1 -1
- package/dist/config.d.ts +4 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +19 -5
- package/dist/config.js.map +1 -1
- package/dist/credentials.d.ts +13 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +57 -0
- package/dist/credentials.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -4
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +8 -3
- package/dist/server.js.map +1 -1
- package/dist/setup.d.ts +17 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +152 -0
- package/dist/setup.js.map +1 -0
- package/dist/tools/definitions.d.ts +2 -2
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +53 -18
- package/dist/tools/definitions.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +3 -1
package/dist/config.js
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const
|
|
1
|
+
import { loadStoredCredentials, } from "./credentials.js";
|
|
2
|
+
export function loadConfig(env = process.env, storedCredentialLoader = loadStoredCredentials) {
|
|
3
|
+
const hasEnvironmentCredential = Boolean(env.SIPGATE_TOKEN_ID || env.SIPGATE_TOKEN);
|
|
4
|
+
const storedCredentials = hasEnvironmentCredential
|
|
5
|
+
? undefined
|
|
6
|
+
: storedCredentialLoader();
|
|
7
|
+
const tokenId = env.SIPGATE_TOKEN_ID ?? storedCredentials?.tokenId;
|
|
8
|
+
const token = env.SIPGATE_TOKEN ?? storedCredentials?.token;
|
|
4
9
|
if (!tokenId || !token) {
|
|
5
|
-
throw new Error("
|
|
10
|
+
throw new Error("Credentials are missing. Run 'sipgate-mcp setup' or set both SIPGATE_TOKEN_ID and SIPGATE_TOKEN.");
|
|
6
11
|
}
|
|
7
|
-
|
|
12
|
+
const accessScope = env.SIPGATE_MCP_SCOPE ?? "user";
|
|
13
|
+
if (accessScope !== "user" && accessScope !== "account") {
|
|
14
|
+
throw new Error("SIPGATE_MCP_SCOPE must be either 'user' or 'account'.");
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
accessScope,
|
|
18
|
+
tokenId,
|
|
19
|
+
token,
|
|
20
|
+
readonly: env.SIPGATE_MCP_READONLY === "1",
|
|
21
|
+
};
|
|
8
22
|
}
|
|
9
23
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,GAEtB,MAAM,kBAAkB,CAAC;AAS1B,MAAM,UAAU,UAAU,CACxB,GAAG,GAAsB,OAAO,CAAC,GAAG,EACpC,sBAAsB,GAAyC,qBAAqB;IAEpF,MAAM,wBAAwB,GAAG,OAAO,CACtC,GAAG,CAAC,gBAAgB,IAAI,GAAG,CAAC,aAAa,CAC1C,CAAC;IACF,MAAM,iBAAiB,GAAG,wBAAwB;QAChD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,sBAAsB,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,gBAAgB,IAAI,iBAAiB,EAAE,OAAO,CAAC;IACnE,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,IAAI,iBAAiB,EAAE,KAAK,CAAC;IAC5D,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC;IACpD,IAAI,WAAW,KAAK,MAAM,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO;QACL,WAAW;QACX,OAAO;QACP,KAAK;QACL,QAAQ,EAAE,GAAG,CAAC,oBAAoB,KAAK,GAAG;KAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface SipgateCredentials {
|
|
2
|
+
tokenId: string;
|
|
3
|
+
token: string;
|
|
4
|
+
}
|
|
5
|
+
export declare const MACOS_KEYCHAIN_SERVICE = "sipgate-mcp";
|
|
6
|
+
export declare const MACOS_KEYCHAIN_TOKEN_ID_ACCOUNT = "pat-token-id";
|
|
7
|
+
export declare const MACOS_KEYCHAIN_TOKEN_ACCOUNT = "pat-token";
|
|
8
|
+
type KeychainReader = (account: string) => string;
|
|
9
|
+
type KeychainWriter = (account: string) => void;
|
|
10
|
+
export declare function loadStoredCredentials(platform?: NodeJS.Platform, readKeychain?: KeychainReader): SipgateCredentials | undefined;
|
|
11
|
+
export declare function storeCredentialsInteractively(platform?: NodeJS.Platform, writeKeychain?: KeychainWriter, output?: Pick<NodeJS.WriteStream, "write">): void;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,sBAAsB,gBAAgB,CAAC;AACpD,eAAO,MAAM,+BAA+B,iBAAiB,CAAC;AAC9D,eAAO,MAAM,4BAA4B,cAAc,CAAC;AAExD,KAAK,cAAc,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;AAClD,KAAK,cAAc,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAwChD,wBAAgB,qBAAqB,CACnC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,YAAY,GAAE,cAAsC,GACnD,kBAAkB,GAAG,SAAS,CAehC;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,aAAa,GAAE,cAAsC,EACrD,MAAM,GAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAkB,GACzD,IAAI,CAWN"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { execFileSync, spawnSync } from "node:child_process";
|
|
2
|
+
export const MACOS_KEYCHAIN_SERVICE = "sipgate-mcp";
|
|
3
|
+
export const MACOS_KEYCHAIN_TOKEN_ID_ACCOUNT = "pat-token-id";
|
|
4
|
+
export const MACOS_KEYCHAIN_TOKEN_ACCOUNT = "pat-token";
|
|
5
|
+
function defaultKeychainReader(account) {
|
|
6
|
+
return execFileSync("/usr/bin/security", [
|
|
7
|
+
"find-generic-password",
|
|
8
|
+
"-s",
|
|
9
|
+
MACOS_KEYCHAIN_SERVICE,
|
|
10
|
+
"-a",
|
|
11
|
+
account,
|
|
12
|
+
"-w",
|
|
13
|
+
], {
|
|
14
|
+
encoding: "utf8",
|
|
15
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
16
|
+
}).trim();
|
|
17
|
+
}
|
|
18
|
+
function defaultKeychainWriter(account) {
|
|
19
|
+
const result = spawnSync("/usr/bin/security", [
|
|
20
|
+
"add-generic-password",
|
|
21
|
+
"-a",
|
|
22
|
+
account,
|
|
23
|
+
"-s",
|
|
24
|
+
MACOS_KEYCHAIN_SERVICE,
|
|
25
|
+
"-U",
|
|
26
|
+
"-w",
|
|
27
|
+
], { stdio: "inherit" });
|
|
28
|
+
if (result.error || result.status !== 0) {
|
|
29
|
+
throw new Error("macOS Keychain did not store the credential.");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function loadStoredCredentials(platform = process.platform, readKeychain = defaultKeychainReader) {
|
|
33
|
+
if (platform !== "darwin") {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const tokenId = readKeychain(MACOS_KEYCHAIN_TOKEN_ID_ACCOUNT).trim();
|
|
38
|
+
const token = readKeychain(MACOS_KEYCHAIN_TOKEN_ACCOUNT).trim();
|
|
39
|
+
if (!tokenId || !token) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
return { tokenId, token };
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function storeCredentialsInteractively(platform = process.platform, writeKeychain = defaultKeychainWriter, output = process.stderr) {
|
|
49
|
+
if (platform !== "darwin") {
|
|
50
|
+
throw new Error("Secure interactive setup currently supports macOS Keychain only. Use SIPGATE_TOKEN_ID and SIPGATE_TOKEN on this platform.");
|
|
51
|
+
}
|
|
52
|
+
output.write("Enter the sipgate PAT token ID in the macOS Keychain prompt.\n");
|
|
53
|
+
writeKeychain(MACOS_KEYCHAIN_TOKEN_ID_ACCOUNT);
|
|
54
|
+
output.write("Enter the sipgate PAT token in the macOS Keychain prompt.\n");
|
|
55
|
+
writeKeychain(MACOS_KEYCHAIN_TOKEN_ACCOUNT);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAO7D,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAAC;AACpD,MAAM,CAAC,MAAM,+BAA+B,GAAG,cAAc,CAAC;AAC9D,MAAM,CAAC,MAAM,4BAA4B,GAAG,WAAW,CAAC;AAKxD,SAAS,qBAAqB,CAAC,OAAe;IAC5C,OAAO,YAAY,CACjB,mBAAmB,EACnB;QACE,uBAAuB;QACvB,IAAI;QACJ,sBAAsB;QACtB,IAAI;QACJ,OAAO;QACP,IAAI;KACL,EACD;QACE,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;KACpC,CACF,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe;IAC5C,MAAM,MAAM,GAAG,SAAS,CACtB,mBAAmB,EACnB;QACE,sBAAsB;QACtB,IAAI;QACJ,OAAO;QACP,IAAI;QACJ,sBAAsB;QACtB,IAAI;QACJ,IAAI;KACL,EACD,EAAE,KAAK,EAAE,SAAS,EAAE,CACrB,CAAC;IAEF,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,QAAQ,GAAoB,OAAO,CAAC,QAAQ,EAC5C,YAAY,GAAmB,qBAAqB;IAEpD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC,IAAI,EAAE,CAAC;QACrE,MAAM,KAAK,GAAG,YAAY,CAAC,4BAA4B,CAAC,CAAC,IAAI,EAAE,CAAC;QAChE,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,QAAQ,GAAoB,OAAO,CAAC,QAAQ,EAC5C,aAAa,GAAmB,qBAAqB,EACrD,MAAM,GAAsC,OAAO,CAAC,MAAM;IAE1D,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,2HAA2H,CAC5H,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAC/E,aAAa,CAAC,+BAA+B,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAC5E,aAAa,CAAC,4BAA4B,CAAC,CAAC;AAC9C,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
export declare function main(): Promise<void>;
|
|
3
|
+
export declare function runCli(args?: string[]): Promise<void>;
|
|
3
4
|
export declare function isMainModule(moduleUrl: string, entrypoint: string | undefined): boolean;
|
|
4
5
|
export { SipgateBackend } from "./backend/sipgate-backend.js";
|
|
6
|
+
export { AccessPolicyError, createAccessControlledBackend, } from "./backend/access-controlled-backend.js";
|
|
5
7
|
export { SipgateApiError, SipgateClient } from "./backend/sipgate-client.js";
|
|
6
|
-
export type { TelephonyBackend } from "./backend/telephony-backend.js";
|
|
8
|
+
export type { AccessScope, AuthenticatedUserContext, TelephonyBackend, } from "./backend/telephony-backend.js";
|
|
7
9
|
export { createServer } from "./server.js";
|
|
10
|
+
export { loadStoredCredentials, storeCredentialsInteractively, } from "./credentials.js";
|
|
11
|
+
export { buildRegistrationCommand, parseSetupArgs, runSetup } from "./setup.js";
|
|
8
12
|
export { createToolDefinitions } from "./tools/definitions.js";
|
|
13
|
+
export { VERSION } from "./version.js";
|
|
9
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAeA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAO1C;AAED,wBAAsB,MAAM,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBlF;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAUvF;AAaD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EACL,iBAAiB,EACjB,6BAA6B,GAC9B,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC7E,YAAY,EACV,WAAW,EACX,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,17 +2,44 @@
|
|
|
2
2
|
import { realpathSync } from "node:fs";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
+
import { AccessPolicyError, createAccessControlledBackend, } from "./backend/access-controlled-backend.js";
|
|
5
6
|
import { SipgateBackend } from "./backend/sipgate-backend.js";
|
|
6
7
|
import { SipgateClient } from "./backend/sipgate-client.js";
|
|
7
8
|
import { loadConfig } from "./config.js";
|
|
8
9
|
import { createServer } from "./server.js";
|
|
10
|
+
import { runSetup, SETUP_HELP, SetupError } from "./setup.js";
|
|
11
|
+
import { VERSION } from "./version.js";
|
|
9
12
|
export async function main() {
|
|
10
13
|
const config = loadConfig();
|
|
11
14
|
const client = new SipgateClient({ tokenId: config.tokenId, token: config.token });
|
|
12
|
-
const
|
|
13
|
-
const
|
|
15
|
+
const sipgateBackend = new SipgateBackend(client);
|
|
16
|
+
const backend = await createAccessControlledBackend(sipgateBackend, config.accessScope);
|
|
17
|
+
const server = createServer(backend, config.readonly, config.accessScope);
|
|
14
18
|
await server.connect(new StdioServerTransport());
|
|
15
19
|
}
|
|
20
|
+
export async function runCli(args = process.argv.slice(2)) {
|
|
21
|
+
const command = args[0];
|
|
22
|
+
if (command === "setup") {
|
|
23
|
+
if (args[1] === "--help" || args[1] === "-h") {
|
|
24
|
+
process.stdout.write(SETUP_HELP);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
runSetup(args.slice(1));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (command === "--help" || command === "-h" || command === "help") {
|
|
31
|
+
process.stdout.write(SETUP_HELP);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (command === "--version" || command === "-V" || command === "version") {
|
|
35
|
+
process.stdout.write(`${VERSION}\n`);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (command) {
|
|
39
|
+
throw new SetupError(`Unknown command: ${command}`);
|
|
40
|
+
}
|
|
41
|
+
await main();
|
|
42
|
+
}
|
|
16
43
|
export function isMainModule(moduleUrl, entrypoint) {
|
|
17
44
|
if (!entrypoint) {
|
|
18
45
|
return false;
|
|
@@ -25,13 +52,20 @@ export function isMainModule(moduleUrl, entrypoint) {
|
|
|
25
52
|
}
|
|
26
53
|
}
|
|
27
54
|
if (isMainModule(import.meta.url, process.argv[1])) {
|
|
28
|
-
|
|
29
|
-
|
|
55
|
+
runCli().catch((error) => {
|
|
56
|
+
const detail = error instanceof AccessPolicyError || error instanceof SetupError
|
|
57
|
+
? ` ${error.message}`
|
|
58
|
+
: "";
|
|
59
|
+
console.error(`sipgate-mcp failed.${detail} Check credentials and MCP client configuration.`);
|
|
30
60
|
process.exitCode = 1;
|
|
31
61
|
});
|
|
32
62
|
}
|
|
33
63
|
export { SipgateBackend } from "./backend/sipgate-backend.js";
|
|
64
|
+
export { AccessPolicyError, createAccessControlledBackend, } from "./backend/access-controlled-backend.js";
|
|
34
65
|
export { SipgateApiError, SipgateClient } from "./backend/sipgate-client.js";
|
|
35
66
|
export { createServer } from "./server.js";
|
|
67
|
+
export { loadStoredCredentials, storeCredentialsInteractively, } from "./credentials.js";
|
|
68
|
+
export { buildRegistrationCommand, parseSetupArgs, runSetup } from "./setup.js";
|
|
36
69
|
export { createToolDefinitions } from "./tools/definitions.js";
|
|
70
|
+
export { VERSION } from "./version.js";
|
|
37
71
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
-
import type { TelephonyBackend } from "./backend/telephony-backend.js";
|
|
3
|
-
export declare function createServer(backend: TelephonyBackend, readonly?: boolean): Server;
|
|
2
|
+
import type { AccessScope, TelephonyBackend } from "./backend/telephony-backend.js";
|
|
3
|
+
export declare function createServer(backend: TelephonyBackend, readonly?: boolean, accessScope?: AccessScope): Server;
|
|
4
4
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAOnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAOnE,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAuBpF,wBAAgB,YAAY,CAC1B,OAAO,EAAE,gBAAgB,EACzB,QAAQ,UAAQ,EAChB,WAAW,GAAE,WAAoB,GAChC,MAAM,CA4CR"}
|
package/dist/server.js
CHANGED
|
@@ -20,10 +20,15 @@ function jsonSchemaFor(schema) {
|
|
|
20
20
|
const { $schema: _ignored, ...inputSchema } = generated;
|
|
21
21
|
return inputSchema;
|
|
22
22
|
}
|
|
23
|
-
export function createServer(backend, readonly = false) {
|
|
24
|
-
const definitions = createToolDefinitions(backend, readonly);
|
|
23
|
+
export function createServer(backend, readonly = false, accessScope = "user") {
|
|
24
|
+
const definitions = createToolDefinitions(backend, readonly, accessScope);
|
|
25
25
|
const byName = new Map(definitions.map((definition) => [definition.name, definition]));
|
|
26
|
-
const server = new Server({ name: "sipgate-mcp", version: "0.
|
|
26
|
+
const server = new Server({ name: "sipgate-mcp", version: "0.2.0" }, {
|
|
27
|
+
capabilities: { tools: {} },
|
|
28
|
+
instructions: accessScope === "user"
|
|
29
|
+
? `This sipgate MCP is restricted to the authenticated user's resources. ${readonly ? "It is read-only and cannot change the account." : "It may change that user's telephony settings or initiate chargeable actions when explicitly requested."} Never request or infer another user's ID.`
|
|
30
|
+
: `This sipgate MCP has account scope and the authenticated sipgate user was verified as an administrator. ${readonly ? "It is read-only and cannot change the account." : "It may change account-wide telephony settings or initiate chargeable actions when explicitly requested."}`,
|
|
31
|
+
});
|
|
27
32
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
28
33
|
tools: definitions.map((definition) => ({
|
|
29
34
|
name: definition.name,
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,OAAO,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACrD,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,2BAA2B,EAAE,kBAAkB,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,4CAA4C,CAAC;AACtD,CAAC;AAED,SAAS,aAAa,CAAC,MAA0C;IAC/D,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAChE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,GAAG,SAAS,CAAC;IACxD,OAAO,WAAkC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,YAAY,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/setup.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type SetupClient = "codex" | "claude";
|
|
2
|
+
export interface SetupOptions {
|
|
3
|
+
allowWrites: boolean;
|
|
4
|
+
clients: SetupClient[];
|
|
5
|
+
dryRun: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface ClientCommand {
|
|
8
|
+
command: string;
|
|
9
|
+
args: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare class SetupError extends Error {
|
|
12
|
+
}
|
|
13
|
+
export declare function parseSetupArgs(args: string[]): SetupOptions;
|
|
14
|
+
export declare function buildRegistrationCommand(client: SetupClient, nodeExecutable: string, entrypoint: string, allowWrites: boolean): ClientCommand;
|
|
15
|
+
export declare function runSetup(args: string[], entrypointArgument?: string | undefined): void;
|
|
16
|
+
export declare const SETUP_HELP = "Usage:\n sipgate-mcp Start the MCP stdio server\n sipgate-mcp setup [options] Store credentials and register MCP clients\n sipgate-mcp --version Print the installed version\n\nSetup options:\n --client codex|claude Register only this client (repeatable)\n --allow-writes Register write tools; default is read-only\n --dry-run Print registration commands without changing anything\n";
|
|
17
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,qBAAa,UAAW,SAAQ,KAAK;CAAG;AAExC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAkC3D;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,OAAO,GACnB,aAAa,CA2Cf;AAoBD,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EAAE,EACd,kBAAkB,GAAE,MAAM,GAAG,SAA2B,GACvD,IAAI,CA+DN;AAED,eAAO,MAAM,UAAU,qdAStB,CAAC"}
|
package/dist/setup.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { storeCredentialsInteractively } from "./credentials.js";
|
|
4
|
+
export class SetupError extends Error {
|
|
5
|
+
}
|
|
6
|
+
export function parseSetupArgs(args) {
|
|
7
|
+
const clients = [];
|
|
8
|
+
let allowWrites = false;
|
|
9
|
+
let dryRun = false;
|
|
10
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
11
|
+
const argument = args[index];
|
|
12
|
+
if (argument === "--allow-writes") {
|
|
13
|
+
allowWrites = true;
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (argument === "--dry-run") {
|
|
17
|
+
dryRun = true;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (argument === "--client") {
|
|
21
|
+
const client = args[index + 1];
|
|
22
|
+
if (client !== "codex" && client !== "claude") {
|
|
23
|
+
throw new SetupError("--client must be either 'codex' or 'claude'.");
|
|
24
|
+
}
|
|
25
|
+
if (!clients.includes(client)) {
|
|
26
|
+
clients.push(client);
|
|
27
|
+
}
|
|
28
|
+
index += 1;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
throw new SetupError(`Unknown setup option: ${argument ?? ""}`);
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
allowWrites,
|
|
35
|
+
clients: clients.length > 0 ? clients : ["codex", "claude"],
|
|
36
|
+
dryRun,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function buildRegistrationCommand(client, nodeExecutable, entrypoint, allowWrites) {
|
|
40
|
+
const modeEnvironment = [
|
|
41
|
+
"SIPGATE_MCP_SCOPE=user",
|
|
42
|
+
`SIPGATE_MCP_READONLY=${allowWrites ? "0" : "1"}`,
|
|
43
|
+
];
|
|
44
|
+
if (client === "codex") {
|
|
45
|
+
return {
|
|
46
|
+
command: "codex",
|
|
47
|
+
args: [
|
|
48
|
+
"mcp",
|
|
49
|
+
"add",
|
|
50
|
+
"sipgate",
|
|
51
|
+
"--env",
|
|
52
|
+
modeEnvironment[0],
|
|
53
|
+
"--env",
|
|
54
|
+
modeEnvironment[1],
|
|
55
|
+
"--",
|
|
56
|
+
nodeExecutable,
|
|
57
|
+
entrypoint,
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
command: "claude",
|
|
63
|
+
args: [
|
|
64
|
+
"mcp",
|
|
65
|
+
"add",
|
|
66
|
+
"--transport",
|
|
67
|
+
"stdio",
|
|
68
|
+
"--scope",
|
|
69
|
+
"user",
|
|
70
|
+
"--env",
|
|
71
|
+
modeEnvironment[0],
|
|
72
|
+
"--env",
|
|
73
|
+
modeEnvironment[1],
|
|
74
|
+
"sipgate",
|
|
75
|
+
"--",
|
|
76
|
+
nodeExecutable,
|
|
77
|
+
entrypoint,
|
|
78
|
+
],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function isCommandAvailable(command) {
|
|
82
|
+
const result = spawnSync(command, ["--version"], { stdio: "ignore" });
|
|
83
|
+
return !result.error && result.status === 0;
|
|
84
|
+
}
|
|
85
|
+
function isAlreadyConfigured(client) {
|
|
86
|
+
const result = spawnSync(client, ["mcp", "get", "sipgate"], {
|
|
87
|
+
stdio: "ignore",
|
|
88
|
+
});
|
|
89
|
+
return !result.error && result.status === 0;
|
|
90
|
+
}
|
|
91
|
+
function shellDisplay(command) {
|
|
92
|
+
return [command.command, ...command.args]
|
|
93
|
+
.map((part) => (/^[A-Za-z0-9_./:=+-]+$/.test(part) ? part : JSON.stringify(part)))
|
|
94
|
+
.join(" ");
|
|
95
|
+
}
|
|
96
|
+
export function runSetup(args, entrypointArgument = process.argv[1]) {
|
|
97
|
+
const options = parseSetupArgs(args);
|
|
98
|
+
if (!entrypointArgument) {
|
|
99
|
+
throw new SetupError("Could not determine the sipgate-mcp entrypoint.");
|
|
100
|
+
}
|
|
101
|
+
const entrypoint = resolve(entrypointArgument);
|
|
102
|
+
const commands = options.clients.map((client) => ({
|
|
103
|
+
client,
|
|
104
|
+
registration: buildRegistrationCommand(client, process.execPath, entrypoint, options.allowWrites),
|
|
105
|
+
}));
|
|
106
|
+
if (options.dryRun) {
|
|
107
|
+
process.stdout.write("Dry run: no credentials or MCP configurations were changed.\n");
|
|
108
|
+
for (const { registration } of commands) {
|
|
109
|
+
process.stdout.write(`${shellDisplay(registration)}\n`);
|
|
110
|
+
}
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
process.stderr.write("sipgate-mcp will store the PAT in macOS Keychain. Secret values are not written to MCP configuration or shell history.\n");
|
|
114
|
+
try {
|
|
115
|
+
storeCredentialsInteractively();
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
const message = error instanceof Error
|
|
119
|
+
? error.message
|
|
120
|
+
: "Secure credential storage failed.";
|
|
121
|
+
throw new SetupError(message);
|
|
122
|
+
}
|
|
123
|
+
for (const { client, registration } of commands) {
|
|
124
|
+
if (!isCommandAvailable(client)) {
|
|
125
|
+
process.stderr.write(`Skipping ${client}: command not found.\n`);
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (isAlreadyConfigured(client)) {
|
|
129
|
+
process.stderr.write(`Skipping ${client}: an MCP server named 'sipgate' is already configured. Remove it first to replace its launch command.\n`);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const result = spawnSync(registration.command, registration.args, {
|
|
133
|
+
stdio: "inherit",
|
|
134
|
+
});
|
|
135
|
+
if (result.error || result.status !== 0) {
|
|
136
|
+
throw new SetupError(`Could not register sipgate-mcp with ${client}.`);
|
|
137
|
+
}
|
|
138
|
+
process.stderr.write(`Registered sipgate-mcp with ${client} in user scope (${options.allowWrites ? "writes enabled" : "read-only"}).\n`);
|
|
139
|
+
}
|
|
140
|
+
process.stderr.write("Setup complete. Restart Codex or Claude, open /mcp, and ask it to list your sipgate numbers.\n");
|
|
141
|
+
}
|
|
142
|
+
export const SETUP_HELP = `Usage:
|
|
143
|
+
sipgate-mcp Start the MCP stdio server
|
|
144
|
+
sipgate-mcp setup [options] Store credentials and register MCP clients
|
|
145
|
+
sipgate-mcp --version Print the installed version
|
|
146
|
+
|
|
147
|
+
Setup options:
|
|
148
|
+
--client codex|claude Register only this client (repeatable)
|
|
149
|
+
--allow-writes Register write tools; default is read-only
|
|
150
|
+
--dry-run Print registration commands without changing anything
|
|
151
|
+
`;
|
|
152
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import type { JsonValue, TelephonyBackend } from "../backend/telephony-backend.js";
|
|
2
|
+
import type { AccessScope, JsonValue, TelephonyBackend } from "../backend/telephony-backend.js";
|
|
3
3
|
export interface ToolAnnotations {
|
|
4
4
|
readOnlyHint: boolean;
|
|
5
5
|
destructiveHint: boolean;
|
|
@@ -13,5 +13,5 @@ export interface ToolDefinition {
|
|
|
13
13
|
annotations: ToolAnnotations;
|
|
14
14
|
execute(input: unknown): Promise<JsonValue>;
|
|
15
15
|
}
|
|
16
|
-
export declare function createToolDefinitions(backend: TelephonyBackend, readonly?: boolean): ToolDefinition[];
|
|
16
|
+
export declare function createToolDefinitions(backend: TelephonyBackend, readonly?: boolean, accessScope?: AccessScope): ToolDefinition[];
|
|
17
17
|
//# sourceMappingURL=definitions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEhG,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAChD,WAAW,EAAE,eAAe,CAAC;IAC7B,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CAC7C;AA2CD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,gBAAgB,EACzB,QAAQ,UAAQ,EAChB,WAAW,GAAE,WAAoB,GAChC,cAAc,EAAE,CAsMlB"}
|