@markusvankempen/quantum-openqasm-mcp 1.7.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/LICENSE +201 -0
- package/README.md +232 -0
- package/dist/backend-utils.d.ts +17 -0
- package/dist/backend-utils.d.ts.map +1 -0
- package/dist/backend-utils.js +141 -0
- package/dist/backend-utils.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +9 -0
- package/dist/cli.js.map +1 -0
- package/dist/env.d.ts +10 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +35 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/result-utils.d.ts +16 -0
- package/dist/result-utils.d.ts.map +1 -0
- package/dist/result-utils.js +156 -0
- package/dist/result-utils.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +301 -0
- package/dist/server.js.map +1 -0
- package/package.json +115 -0
package/dist/env.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { config as loadDotenv } from 'dotenv';
|
|
5
|
+
const DEFAULT_ENDPOINT = 'https://us-east.quantum-computing.cloud.ibm.com';
|
|
6
|
+
/** Load .env from cwd, then ~/.quantum-openqasm-mcp/.env (legacy: ~/.quantum-mcp/.env). */
|
|
7
|
+
export function loadEnvFiles() {
|
|
8
|
+
const candidates = [
|
|
9
|
+
path.join(process.cwd(), '.env'),
|
|
10
|
+
path.join(os.homedir(), '.quantum-openqasm-mcp', '.env'),
|
|
11
|
+
path.join(os.homedir(), '.quantum-mcp', '.env'),
|
|
12
|
+
];
|
|
13
|
+
for (const file of candidates) {
|
|
14
|
+
if (fs.existsSync(file)) {
|
|
15
|
+
loadDotenv({ path: file, override: false });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function requireEnv() {
|
|
20
|
+
const apiKey = process.env.IBM_API_KEY;
|
|
21
|
+
if (!apiKey) {
|
|
22
|
+
throw new Error('IBM_API_KEY missing. Set it in the environment or in .env / ~/.quantum-openqasm-mcp/.env');
|
|
23
|
+
}
|
|
24
|
+
const crn = process.env.IBM_SERVICE_CRN;
|
|
25
|
+
if (!crn) {
|
|
26
|
+
throw new Error('IBM_SERVICE_CRN missing. Set it in the environment or in .env / ~/.quantum-openqasm-mcp/.env');
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
apiKey,
|
|
30
|
+
crn,
|
|
31
|
+
endpoint: (process.env.IBM_QUANTUM_ENDPOINT || DEFAULT_ENDPOINT).replace(/\/$/, ''),
|
|
32
|
+
defaultBackend: process.env.IBM_QUANTUM_BACKEND || 'ibm_fez',
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=env.js.map
|
package/dist/env.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC;AAS9C,MAAM,gBAAgB,GAAG,iDAAiD,CAAC;AAE3E,2FAA2F;AAC3F,MAAM,UAAU,YAAY;IACxB,MAAM,UAAU,GAAG;QACf,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,uBAAuB,EAAE,MAAM,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC;KAClD,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU;IACtB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACX,0FAA0F,CAC7F,CAAC;IACN,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACxC,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CACX,8FAA8F,CACjG,CAAC;IACN,CAAC;IACD,OAAO;QACH,MAAM;QACN,GAAG;QACH,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACnF,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,SAAS;KAC/D,CAAC;AACN,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { loadEnvFiles, requireEnv, type QuantumEnv } from './env.js';
|
|
2
|
+
export { createQuantumMcpServer, startQuantumMcpServer, SERVER_NAME, SERVER_VERSION, } from './server.js';
|
|
3
|
+
export { fetchBackendList, formatBackendList, formatBackendLine, parseBackendListResponse, type NormalizedBackend, } from './backend-utils.js';
|
|
4
|
+
export { parseMeasurementResults, parseResultPayload, formatCountsHistogram, type MeasurementResult, } from './result-utils.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EACH,sBAAsB,EACtB,qBAAqB,EACrB,WAAW,EACX,cAAc,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACH,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,EACxB,KAAK,iBAAiB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACH,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,KAAK,iBAAiB,GACzB,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { loadEnvFiles, requireEnv } from './env.js';
|
|
2
|
+
export { createQuantumMcpServer, startQuantumMcpServer, SERVER_NAME, SERVER_VERSION, } from './server.js';
|
|
3
|
+
export { fetchBackendList, formatBackendList, formatBackendLine, parseBackendListResponse, } from './backend-utils.js';
|
|
4
|
+
export { parseMeasurementResults, parseResultPayload, formatCountsHistogram, } from './result-utils.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAmB,MAAM,UAAU,CAAC;AACrE,OAAO,EACH,sBAAsB,EACtB,qBAAqB,EACrB,WAAW,EACX,cAAc,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACH,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,GAE3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACH,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,GAExB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file result-utils.ts — Parse IBM Quantum SamplerV2 measurement results
|
|
3
|
+
*/
|
|
4
|
+
export interface MeasurementResult {
|
|
5
|
+
counts: Record<string, number>;
|
|
6
|
+
register: string;
|
|
7
|
+
shots: number;
|
|
8
|
+
}
|
|
9
|
+
/** Decode IBM hex sample strings (e.g. "0x3" → "11") into bitstring counts. */
|
|
10
|
+
export declare function parseMeasurementResults(data: unknown): MeasurementResult | null;
|
|
11
|
+
/** Parse counts from MCP text lines like " 00: 2006". */
|
|
12
|
+
export declare function parseCountsFromText(text: string): Record<string, number> | null;
|
|
13
|
+
/** Try JSON, IBM API object, or text — return normalized measurement result. */
|
|
14
|
+
export declare function parseResultPayload(dataText: string): MeasurementResult | null;
|
|
15
|
+
export declare function formatCountsHistogram(result: MeasurementResult): string;
|
|
16
|
+
//# sourceMappingURL=result-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-utils.d.ts","sourceRoot":"","sources":["../src/result-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CA4C/E;AAqBD,0DAA0D;AAC1D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAO/E;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAyD7E;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAUvE"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file result-utils.ts — Parse IBM Quantum SamplerV2 measurement results
|
|
3
|
+
*/
|
|
4
|
+
/** Decode IBM hex sample strings (e.g. "0x3" → "11") into bitstring counts. */
|
|
5
|
+
export function parseMeasurementResults(data) {
|
|
6
|
+
if (!data || typeof data !== 'object') {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const root = data;
|
|
10
|
+
let payload = root;
|
|
11
|
+
// Unwrap { results: [...] } from IBM API
|
|
12
|
+
if (Array.isArray(root.results) && root.results[0]) {
|
|
13
|
+
payload = root.results[0];
|
|
14
|
+
}
|
|
15
|
+
const dataBlock = payload.data;
|
|
16
|
+
if (!dataBlock || typeof dataBlock !== 'object') {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
const register = Object.keys(dataBlock)[0];
|
|
20
|
+
if (!register) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const regData = dataBlock[register];
|
|
24
|
+
const counts = {};
|
|
25
|
+
if (Array.isArray(regData.samples)) {
|
|
26
|
+
const samples = regData.samples;
|
|
27
|
+
const numBits = inferNumBits(samples, regData.num_bits);
|
|
28
|
+
for (const sample of samples) {
|
|
29
|
+
const bits = hexSampleToBits(sample, numBits);
|
|
30
|
+
counts[bits] = (counts[bits] ?? 0) + 1;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else if (Array.isArray(regData.array)) {
|
|
34
|
+
for (const shot of regData.array) {
|
|
35
|
+
const bits = Array.isArray(shot)
|
|
36
|
+
? shot.flat().join('')
|
|
37
|
+
: String(shot);
|
|
38
|
+
counts[bits] = (counts[bits] ?? 0) + 1;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else if (regData.counts && typeof regData.counts === 'object') {
|
|
42
|
+
Object.assign(counts, regData.counts);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const shots = Object.values(counts).reduce((s, v) => s + v, 0);
|
|
48
|
+
if (shots === 0) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return { counts, register, shots };
|
|
52
|
+
}
|
|
53
|
+
function inferNumBits(samples, explicit) {
|
|
54
|
+
if (explicit && explicit > 0) {
|
|
55
|
+
return explicit;
|
|
56
|
+
}
|
|
57
|
+
let maxVal = 0;
|
|
58
|
+
for (const s of samples) {
|
|
59
|
+
if (typeof s === 'string' && s.startsWith('0x')) {
|
|
60
|
+
maxVal = Math.max(maxVal, parseInt(s, 16));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const inferred = Math.max(1, maxVal.toString(2).length);
|
|
64
|
+
return Math.max(inferred, 2);
|
|
65
|
+
}
|
|
66
|
+
function hexSampleToBits(sample, numBits) {
|
|
67
|
+
if (typeof sample === 'string' && sample.startsWith('0x')) {
|
|
68
|
+
return parseInt(sample, 16).toString(2).padStart(numBits, '0');
|
|
69
|
+
}
|
|
70
|
+
return String(sample);
|
|
71
|
+
}
|
|
72
|
+
/** Parse counts from MCP text lines like " 00: 2006". */
|
|
73
|
+
export function parseCountsFromText(text) {
|
|
74
|
+
const counts = {};
|
|
75
|
+
for (const line of text.split('\n')) {
|
|
76
|
+
const m = line.trim().match(/^([01]+):\s*(\d+)$/);
|
|
77
|
+
if (m) {
|
|
78
|
+
counts[m[1]] = parseInt(m[2], 10);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return Object.keys(counts).length > 0 ? counts : null;
|
|
82
|
+
}
|
|
83
|
+
/** Try JSON, IBM API object, or text — return normalized measurement result. */
|
|
84
|
+
export function parseResultPayload(dataText) {
|
|
85
|
+
// Try JSON first
|
|
86
|
+
try {
|
|
87
|
+
const parsed = JSON.parse(dataText);
|
|
88
|
+
if (parsed && typeof parsed === 'object') {
|
|
89
|
+
// Panel/MCP may send { counts: { "00": 1 } }
|
|
90
|
+
if (parsed.counts && typeof parsed.counts === 'object' && !Array.isArray(parsed.counts)) {
|
|
91
|
+
const shots = Object.values(parsed.counts)
|
|
92
|
+
.reduce((s, v) => s + Number(v), 0);
|
|
93
|
+
return {
|
|
94
|
+
counts: parsed.counts,
|
|
95
|
+
register: String(parsed.register || 'c'),
|
|
96
|
+
shots: Number(parsed.shots || shots),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// Plain counts map { "00": 123, "11": 456 }
|
|
100
|
+
const keys = Object.keys(parsed);
|
|
101
|
+
if (keys.length > 0 && keys.every((k) => /^[01]+$/.test(k))) {
|
|
102
|
+
const shots = Object.values(parsed)
|
|
103
|
+
.reduce((s, v) => s + Number(v), 0);
|
|
104
|
+
return { counts: parsed, register: 'c', shots };
|
|
105
|
+
}
|
|
106
|
+
const fromApi = parseMeasurementResults(parsed);
|
|
107
|
+
if (fromApi) {
|
|
108
|
+
return fromApi;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// not JSON — try text lines
|
|
114
|
+
}
|
|
115
|
+
const fromText = parseCountsFromText(dataText);
|
|
116
|
+
if (fromText) {
|
|
117
|
+
const shots = Object.values(fromText).reduce((s, v) => s + v, 0);
|
|
118
|
+
return { counts: fromText, register: 'c', shots };
|
|
119
|
+
}
|
|
120
|
+
// Embedded JSON in MCP message (structured counts or raw IBM API payload)
|
|
121
|
+
const jsonStart = dataText.indexOf('{');
|
|
122
|
+
if (jsonStart >= 0) {
|
|
123
|
+
try {
|
|
124
|
+
const embedded = JSON.parse(dataText.slice(jsonStart));
|
|
125
|
+
if (embedded && typeof embedded === 'object') {
|
|
126
|
+
if (embedded.counts && typeof embedded.counts === 'object' && !Array.isArray(embedded.counts)) {
|
|
127
|
+
const shots = Object.values(embedded.counts)
|
|
128
|
+
.reduce((s, v) => s + Number(v), 0);
|
|
129
|
+
return {
|
|
130
|
+
counts: embedded.counts,
|
|
131
|
+
register: String(embedded.register || 'c'),
|
|
132
|
+
shots: Number(embedded.shots || shots),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
const fromEmbedded = parseMeasurementResults(embedded);
|
|
136
|
+
if (fromEmbedded) {
|
|
137
|
+
return fromEmbedded;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch { /* ignore */ }
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
export function formatCountsHistogram(result) {
|
|
146
|
+
const { counts, register, shots } = result;
|
|
147
|
+
const lines = [`Register: ${register} | Shots: ${shots}`, ''];
|
|
148
|
+
const entries = Object.entries(counts).sort((a, b) => b[1] - a[1]);
|
|
149
|
+
for (const [bits, count] of entries) {
|
|
150
|
+
const pct = shots > 0 ? Math.round((count / shots) * 100) : 0;
|
|
151
|
+
const barLen = Math.max(1, Math.round((count / shots) * 30));
|
|
152
|
+
lines.push(` |${bits}⟩ : ${String(count).padStart(5)} (${String(pct).padStart(3)}%) ${'█'.repeat(barLen)}`);
|
|
153
|
+
}
|
|
154
|
+
return lines.join('\n');
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=result-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-utils.js","sourceRoot":"","sources":["../src/result-utils.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IBM Quantum MCP server (stdio transport)
|
|
3
|
+
*/
|
|
4
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
5
|
+
export declare const SERVER_NAME = "quantum-openqasm-mcp";
|
|
6
|
+
export declare const SERVER_VERSION = "1.7.0";
|
|
7
|
+
export declare function createQuantumMcpServer(): Server;
|
|
8
|
+
/** Start the MCP server on stdio (for Cursor, VS Code, Claude Desktop, etc.). */
|
|
9
|
+
export declare function startQuantumMcpServer(): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAQnE,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAClD,eAAO,MAAM,cAAc,UAAU,CAAC;AAqKtC,wBAAgB,sBAAsB,IAAI,MAAM,CAqJ/C;AAED,iFAAiF;AACjF,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAK3D"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IBM Quantum MCP server (stdio transport)
|
|
3
|
+
*/
|
|
4
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
5
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
6
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
7
|
+
import axios from 'axios';
|
|
8
|
+
import { fetchBackendList, formatBackendList } from './backend-utils.js';
|
|
9
|
+
import { requireEnv } from './env.js';
|
|
10
|
+
import { formatCountsHistogram, parseMeasurementResults } from './result-utils.js';
|
|
11
|
+
export const SERVER_NAME = 'quantum-openqasm-mcp';
|
|
12
|
+
export const SERVER_VERSION = '1.7.0';
|
|
13
|
+
const API_VERSION = '2023-11-16';
|
|
14
|
+
let cachedToken = null;
|
|
15
|
+
let tokenExpiry = 0;
|
|
16
|
+
async function getIBMAccessToken(apiKey) {
|
|
17
|
+
if (cachedToken && Date.now() < tokenExpiry - 300000) {
|
|
18
|
+
return cachedToken;
|
|
19
|
+
}
|
|
20
|
+
const response = await axios.post('https://iam.cloud.ibm.com/identity/token', new URLSearchParams({
|
|
21
|
+
grant_type: 'urn:ibm:params:oauth:grant-type:apikey',
|
|
22
|
+
apikey: apiKey,
|
|
23
|
+
}), {
|
|
24
|
+
headers: {
|
|
25
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
26
|
+
Accept: 'application/json',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
cachedToken = response.data.access_token;
|
|
30
|
+
tokenExpiry = Date.now() + response.data.expires_in * 1000;
|
|
31
|
+
return cachedToken;
|
|
32
|
+
}
|
|
33
|
+
async function getAuthHeaders(env) {
|
|
34
|
+
const token = await getIBMAccessToken(env.apiKey);
|
|
35
|
+
return {
|
|
36
|
+
Authorization: `Bearer ${token}`,
|
|
37
|
+
'IBM-API-Version': API_VERSION,
|
|
38
|
+
'Service-CRN': env.crn,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function extractApiError(error) {
|
|
42
|
+
const err = error;
|
|
43
|
+
return (err.response?.data?.errors?.[0]?.message ||
|
|
44
|
+
err.response?.data?.error?.message ||
|
|
45
|
+
err.message ||
|
|
46
|
+
'Unknown error');
|
|
47
|
+
}
|
|
48
|
+
function textResult(text, isError = false) {
|
|
49
|
+
return { content: [{ type: 'text', text }], isError };
|
|
50
|
+
}
|
|
51
|
+
async function listBackends(env) {
|
|
52
|
+
const headers = await getAuthHeaders(env);
|
|
53
|
+
const { backends, raw } = await fetchBackendList(env.endpoint, headers, true);
|
|
54
|
+
if (backends.length === 0) {
|
|
55
|
+
return `No backends found. Raw response:\n${JSON.stringify(raw, null, 2).slice(0, 1000)}`;
|
|
56
|
+
}
|
|
57
|
+
return formatBackendList(backends);
|
|
58
|
+
}
|
|
59
|
+
async function getBackend(env, backendName) {
|
|
60
|
+
const headers = await getAuthHeaders(env);
|
|
61
|
+
const base = env.endpoint.replace(/\/$/, '');
|
|
62
|
+
try {
|
|
63
|
+
const res = await axios.get(`${base}/backends/${backendName}`, { headers });
|
|
64
|
+
return JSON.stringify(res.data, null, 2);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
const [statusRes, configRes] = await Promise.allSettled([
|
|
68
|
+
axios.get(`${base}/backends/${backendName}/status`, { headers }),
|
|
69
|
+
axios.get(`${base}/backends/${backendName}/configuration`, { headers }),
|
|
70
|
+
]);
|
|
71
|
+
const parts = [`Backend: ${backendName}`];
|
|
72
|
+
if (statusRes.status === 'fulfilled') {
|
|
73
|
+
const s = statusRes.value.data;
|
|
74
|
+
parts.push(`Status: ${s.status || s.message || '?'}`);
|
|
75
|
+
if (s.length_queue !== undefined) {
|
|
76
|
+
parts.push(`Queue: ${s.length_queue}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (configRes.status === 'fulfilled') {
|
|
80
|
+
const c = configRes.value.data;
|
|
81
|
+
parts.push(`Qubits: ${c.n_qubits ?? c.num_qubits ?? '?'}`);
|
|
82
|
+
parts.push(`Basis gates: ${(c.basis_gates || []).join(', ')}`);
|
|
83
|
+
}
|
|
84
|
+
return parts.join('\n');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async function getBackendConfiguration(env, backendName) {
|
|
88
|
+
const headers = await getAuthHeaders(env);
|
|
89
|
+
const res = await axios.get(`${env.endpoint}/backends/${backendName}/configuration`, { headers });
|
|
90
|
+
return JSON.stringify(res.data, null, 2);
|
|
91
|
+
}
|
|
92
|
+
async function listJobs(env) {
|
|
93
|
+
const headers = await getAuthHeaders(env);
|
|
94
|
+
const res = await axios.get(`${env.endpoint}/jobs`, { headers });
|
|
95
|
+
const jobs = res.data.jobs ?? res.data;
|
|
96
|
+
if (!Array.isArray(jobs)) {
|
|
97
|
+
return JSON.stringify(res.data, null, 2);
|
|
98
|
+
}
|
|
99
|
+
const lines = jobs.slice(0, 20).map((j) => `${j.id} status=${j.status} backend=${j.backend || '?'} created=${j.created_time || j.created_at || '?'}`);
|
|
100
|
+
const suffix = jobs.length > 20 ? `\n... and ${jobs.length - 20} more` : '';
|
|
101
|
+
return `Found ${jobs.length} jobs:\n${lines.join('\n')}${suffix}`;
|
|
102
|
+
}
|
|
103
|
+
async function getJobStatus(env, jobId) {
|
|
104
|
+
const headers = await getAuthHeaders(env);
|
|
105
|
+
const res = await axios.get(`${env.endpoint}/jobs/${jobId}`, { headers });
|
|
106
|
+
const job = res.data;
|
|
107
|
+
const status = job.state?.status ?? job.status ?? 'UNKNOWN';
|
|
108
|
+
return [
|
|
109
|
+
`Job ID: ${job.id || jobId}`,
|
|
110
|
+
`Status: ${status}`,
|
|
111
|
+
`Backend: ${job.backend || '?'}`,
|
|
112
|
+
`Program: ${job.program_id || '?'}`,
|
|
113
|
+
job.created_time || job.created_at ? `Created: ${job.created_time || job.created_at}` : '',
|
|
114
|
+
job.reason_message ? `Reason: ${job.reason_message}` : '',
|
|
115
|
+
].filter(Boolean).join('\n');
|
|
116
|
+
}
|
|
117
|
+
async function getJobResults(env, jobId) {
|
|
118
|
+
const headers = await getAuthHeaders(env);
|
|
119
|
+
const resultRes = await axios.get(`${env.endpoint}/jobs/${jobId}/results`, { headers });
|
|
120
|
+
const results = resultRes.data;
|
|
121
|
+
const parsed = parseMeasurementResults(results);
|
|
122
|
+
if (parsed) {
|
|
123
|
+
const histogram = formatCountsHistogram(parsed);
|
|
124
|
+
const countsJson = JSON.stringify({
|
|
125
|
+
counts: parsed.counts,
|
|
126
|
+
register: parsed.register,
|
|
127
|
+
shots: parsed.shots,
|
|
128
|
+
});
|
|
129
|
+
return [
|
|
130
|
+
`Job ${jobId} COMPLETED`,
|
|
131
|
+
'',
|
|
132
|
+
histogram,
|
|
133
|
+
'',
|
|
134
|
+
'Measurement counts:',
|
|
135
|
+
countsJson,
|
|
136
|
+
].join('\n');
|
|
137
|
+
}
|
|
138
|
+
return `Job ${jobId} results:\n${JSON.stringify(results, null, 2).slice(0, 2000)}`;
|
|
139
|
+
}
|
|
140
|
+
async function submitQasmJob(env, qasm, backend) {
|
|
141
|
+
const headers = await getAuthHeaders(env);
|
|
142
|
+
const res = await axios.post(`${env.endpoint}/jobs`, { program_id: 'sampler', backend, params: { version: 2, pubs: [[qasm]] } }, { headers: { ...headers, 'Content-Type': 'application/json' } });
|
|
143
|
+
const jobId = res.data.id;
|
|
144
|
+
return `Successfully submitted job to ibm_quantum on backend ${backend}. Job ID: ${jobId}`;
|
|
145
|
+
}
|
|
146
|
+
async function cancelJob(env, jobId) {
|
|
147
|
+
const headers = await getAuthHeaders(env);
|
|
148
|
+
await axios.post(`${env.endpoint}/jobs/${jobId}/cancel`, {}, { headers });
|
|
149
|
+
return `Cancel request submitted for job ${jobId}`;
|
|
150
|
+
}
|
|
151
|
+
export function createQuantumMcpServer() {
|
|
152
|
+
const server = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {} } });
|
|
153
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
154
|
+
tools: [
|
|
155
|
+
{
|
|
156
|
+
name: 'list_backends',
|
|
157
|
+
description: 'List available IBM Quantum backends with name, status, and qubit count.',
|
|
158
|
+
inputSchema: { type: 'object', properties: {} },
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
name: 'get_backend',
|
|
162
|
+
description: 'Get details for a specific IBM Quantum backend by name.',
|
|
163
|
+
inputSchema: {
|
|
164
|
+
type: 'object',
|
|
165
|
+
properties: {
|
|
166
|
+
backend_name: { type: 'string', description: 'Backend name, e.g. ibm_fez' },
|
|
167
|
+
},
|
|
168
|
+
required: ['backend_name'],
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: 'get_backend_configuration',
|
|
173
|
+
description: 'Get gate set and coupling configuration for a backend (useful for ISA circuit prep).',
|
|
174
|
+
inputSchema: {
|
|
175
|
+
type: 'object',
|
|
176
|
+
properties: {
|
|
177
|
+
backend_name: { type: 'string', description: 'Backend name, e.g. ibm_fez' },
|
|
178
|
+
},
|
|
179
|
+
required: ['backend_name'],
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
name: 'list_jobs',
|
|
184
|
+
description: 'List recent quantum jobs submitted by this account.',
|
|
185
|
+
inputSchema: { type: 'object', properties: {} },
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: 'submit_qasm_job',
|
|
189
|
+
description: 'Submit an OpenQASM 2.0 ISA circuit to IBM Quantum hardware via SamplerV2.',
|
|
190
|
+
inputSchema: {
|
|
191
|
+
type: 'object',
|
|
192
|
+
properties: {
|
|
193
|
+
qasm_string: { type: 'string', description: 'OpenQASM 2.0 circuit (pre-transpiled to native gates).' },
|
|
194
|
+
provider: { type: 'string', enum: ['ibm_quantum', 'open_quantum'] },
|
|
195
|
+
backend_name: { type: 'string', description: 'Target backend (defaults to IBM_QUANTUM_BACKEND env).' },
|
|
196
|
+
},
|
|
197
|
+
required: ['qasm_string', 'provider'],
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
name: 'get_job_status',
|
|
202
|
+
description: 'Get the current status of a quantum job without fetching full results.',
|
|
203
|
+
inputSchema: {
|
|
204
|
+
type: 'object',
|
|
205
|
+
properties: {
|
|
206
|
+
job_id: { type: 'string', description: 'Job ID from submit_qasm_job.' },
|
|
207
|
+
},
|
|
208
|
+
required: ['job_id'],
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
name: 'get_job_results',
|
|
213
|
+
description: 'Get measurement results from a completed quantum job.',
|
|
214
|
+
inputSchema: {
|
|
215
|
+
type: 'object',
|
|
216
|
+
properties: {
|
|
217
|
+
job_id: { type: 'string', description: 'Job ID of a completed job.' },
|
|
218
|
+
},
|
|
219
|
+
required: ['job_id'],
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
name: 'get_job_result',
|
|
224
|
+
description: 'Get job status and results in one call (legacy combined tool).',
|
|
225
|
+
inputSchema: {
|
|
226
|
+
type: 'object',
|
|
227
|
+
properties: {
|
|
228
|
+
job_id: { type: 'string', description: 'Job ID from submit_qasm_job.' },
|
|
229
|
+
},
|
|
230
|
+
required: ['job_id'],
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
name: 'cancel_job',
|
|
235
|
+
description: 'Cancel a queued or running quantum job.',
|
|
236
|
+
inputSchema: {
|
|
237
|
+
type: 'object',
|
|
238
|
+
properties: {
|
|
239
|
+
job_id: { type: 'string', description: 'Job ID to cancel.' },
|
|
240
|
+
},
|
|
241
|
+
required: ['job_id'],
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
],
|
|
245
|
+
}));
|
|
246
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
247
|
+
const name = request.params.name;
|
|
248
|
+
const args = request.params.arguments ?? {};
|
|
249
|
+
try {
|
|
250
|
+
const env = requireEnv();
|
|
251
|
+
switch (name) {
|
|
252
|
+
case 'list_backends':
|
|
253
|
+
return textResult(await listBackends(env));
|
|
254
|
+
case 'get_backend':
|
|
255
|
+
return textResult(await getBackend(env, args.backend_name));
|
|
256
|
+
case 'get_backend_configuration':
|
|
257
|
+
return textResult(await getBackendConfiguration(env, args.backend_name));
|
|
258
|
+
case 'list_jobs':
|
|
259
|
+
return textResult(await listJobs(env));
|
|
260
|
+
case 'submit_qasm_job': {
|
|
261
|
+
const provider = args.provider;
|
|
262
|
+
if (provider !== 'ibm_quantum') {
|
|
263
|
+
throw new Error(`Provider ${provider} is not supported.`);
|
|
264
|
+
}
|
|
265
|
+
const backend = args.backend_name || env.defaultBackend;
|
|
266
|
+
return textResult(await submitQasmJob(env, args.qasm_string, backend));
|
|
267
|
+
}
|
|
268
|
+
case 'get_job_status':
|
|
269
|
+
return textResult(await getJobStatus(env, args.job_id));
|
|
270
|
+
case 'get_job_results':
|
|
271
|
+
return textResult(await getJobResults(env, args.job_id));
|
|
272
|
+
case 'get_job_result': {
|
|
273
|
+
const jobId = args.job_id;
|
|
274
|
+
const headers = await getAuthHeaders(env);
|
|
275
|
+
const jobRes = await axios.get(`${env.endpoint}/jobs/${jobId}`, { headers });
|
|
276
|
+
const state = jobRes.data.state?.status ?? jobRes.data.status ?? 'UNKNOWN';
|
|
277
|
+
if (/completed|done/i.test(state)) {
|
|
278
|
+
return textResult(await getJobResults(env, jobId));
|
|
279
|
+
}
|
|
280
|
+
return textResult(`Job ${jobId} status: ${state}`);
|
|
281
|
+
}
|
|
282
|
+
case 'cancel_job':
|
|
283
|
+
return textResult(await cancelJob(env, args.job_id));
|
|
284
|
+
default:
|
|
285
|
+
throw new Error(`Tool not found: ${name}`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
return textResult(`Error: ${extractApiError(error)}`, true);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
return server;
|
|
293
|
+
}
|
|
294
|
+
/** Start the MCP server on stdio (for Cursor, VS Code, Claude Desktop, etc.). */
|
|
295
|
+
export async function startQuantumMcpServer() {
|
|
296
|
+
const server = createQuantumMcpServer();
|
|
297
|
+
const transport = new StdioServerTransport();
|
|
298
|
+
await server.connect(transport);
|
|
299
|
+
console.error(`${SERVER_NAME} v${SERVER_VERSION} running on stdio`);
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|