@codazen/harmonica-mcp 3.2.0 → 3.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.
Files changed (2) hide show
  1. package/dist/index.js +10 -5
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -22524,7 +22524,7 @@ Use get_job_status with jobId="${taskId}" to poll for results, or list_checks to
22524
22524
  };
22525
22525
  server.tool(
22526
22526
  "check_beat_coda_quality",
22527
- "Enqueue a Beat definition quality check across 7 dimensions (Distinctive, Harmonious, Substantial, Durable, Clear, Strategically Aligned, Business Outcome) \u2014 grades the Beat's Coda and directing context, persisted as beat_coda_quality. By default returns a jobId immediately (fire-and-forget) \u2014 use get_job_status or list_checks to retrieve results. Set wait=true to block until the check completes and receive the scorecard inline. WARNING: wait=true holds the MCP session open for 30\u201360s per check \u2014 for bulk operations (more than one Beat), omit wait and poll get_job_status separately to avoid session exhaustion.",
22527
+ "Enqueue a Beat definition quality check across 7 dimensions (Distinctive, Harmonious, Substantial, Durable, Clear, Strategically Aligned, Outcome-Oriented) \u2014 grades the Beat's Coda and directing context, persisted as beat_coda_quality. By default returns a jobId immediately (fire-and-forget) \u2014 use get_job_status or list_checks to retrieve results. Set wait=true to block until the check completes and receive the scorecard inline. WARNING: wait=true holds the MCP session open for 30\u201360s per check \u2014 for bulk operations (more than one Beat), omit wait and poll get_job_status separately to avoid session exhaustion.",
22528
22528
  schema,
22529
22529
  handler
22530
22530
  );
@@ -25857,7 +25857,7 @@ var BEAT_QUALITY_DIMENSIONS = [
25857
25857
  "durable",
25858
25858
  "clear",
25859
25859
  "strategicallyAligned",
25860
- "businessOutcome"
25860
+ "outcomeOriented"
25861
25861
  ];
25862
25862
  var BeatDimensionScoreSchema = external_exports.object({
25863
25863
  dimension: external_exports.enum(BEAT_QUALITY_DIMENSIONS),
@@ -28967,7 +28967,7 @@ function formatConsolidationResult(primaryId, primary, archivedBeatIds, notesRea
28967
28967
  function registerPortfolioCoherenceTools(server, ctx, client) {
28968
28968
  server.tool(
28969
28969
  "check_portfolio_coherence",
28970
- "Run a portfolio coherence check on a project. Clusters Beats by semantic similarity to surface fragmentation (merge candidates) and checks what fraction of Beats have a VP-readable business outcome score. By default returns a taskId immediately \u2014 set wait=true to block and receive the full report inline.",
28970
+ "Run a portfolio coherence check on a project. Clusters Beats by semantic similarity to surface fragmentation (merge candidates) and checks what fraction of Beats name an outcome their authoriser would recognise. By default returns a taskId immediately \u2014 set wait=true to block and receive the full report inline.",
28971
28971
  {
28972
28972
  projectId: external_exports.string().min(1).describe("The project ID"),
28973
28973
  wait: external_exports.boolean().optional().describe("Block until the check completes and return the report inline. Default: false.")
@@ -30166,6 +30166,9 @@ async function resolveSnapshotInput(input) {
30166
30166
  return trimmed;
30167
30167
  }
30168
30168
  function formatImportSummary(result, targetTeamspaceId) {
30169
+ if (!result.counts || result.counts.beats == null) {
30170
+ throw new Error(`Import of system ${result.projectId} completed but returned no counts \u2014 check worker logs for a TransactionCanceledException`);
30171
+ }
30169
30172
  const lines = [
30170
30173
  `Imported system: ${result.projectId}`,
30171
30174
  ` Beats: ${result.counts.beats}`,
@@ -33202,7 +33205,9 @@ function createHttpClient(config2) {
33202
33205
  if (!enqueued?.taskId) {
33203
33206
  throw new Error("importSystemSnapshotFromUrl: API did not return a taskId");
33204
33207
  }
33205
- return pollTaskResult(enqueued.taskId);
33208
+ const importResult = await pollTaskResult(enqueued.taskId);
33209
+ if (importResult == null) throw new Error(`Task ${enqueued.taskId} completed but returned no result \u2014 check worker logs for a TransactionCanceledException`);
33210
+ return importResult;
33206
33211
  },
33207
33212
  // Embedding similarity
33208
33213
  embedProjectEntities: (projectId) => request("POST", `/api/systems/${encodeURIComponent(projectId)}/embeddings/generate`),
@@ -34046,7 +34051,7 @@ function loadConfig() {
34046
34051
  };
34047
34052
  }
34048
34053
  async function main() {
34049
- console.error(`[harmonica-mcp] v${"3.2.0"} starting\u2026`);
34054
+ console.error(`[harmonica-mcp] v${"3.3.0"} starting\u2026`);
34050
34055
  const config2 = loadConfig();
34051
34056
  const client = createHttpClient({
34052
34057
  apiBaseUrl: config2.apiBaseUrl,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codazen/harmonica-mcp",
3
- "version": "3.2.0",
3
+ "version": "3.3.0",
4
4
  "description": "MCP server for Harmonica — connect any MCP-compatible AI assistant to Harmonica",
5
5
  "license": "MIT",
6
6
  "bin": {