aibvf-mcp 0.1.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/README.md ADDED
@@ -0,0 +1,47 @@
1
+ # aibvf-mcp
2
+
3
+ MCP server exposing AI BVF v1.0 to any Claude agent. Pre-flight-check your AI initiatives before you deploy them.
4
+
5
+ ## Install and run
6
+
7
+ ```bash
8
+ npx aibvf-mcp
9
+ ```
10
+
11
+ ## Wire into Claude Desktop / Cursor / any MCP host
12
+
13
+ Add to your MCP config:
14
+
15
+ ```json
16
+ {
17
+ "mcpServers": {
18
+ "aibvf": {
19
+ "command": "npx",
20
+ "args": ["-y", "aibvf-mcp"]
21
+ }
22
+ }
23
+ }
24
+ ```
25
+
26
+ Then ask Claude:
27
+
28
+ > *"Score this AI initiative using AI BVF: we're a €2.4bn manufacturer, planning a GenAI predictive maintenance rollout in our EU plants, we're a traditional hierarchy, strong sponsor, modest change budget."*
29
+
30
+ Claude will call `score_initiative` and return the classification, euro range, and reasoning.
31
+
32
+ ## Tools exposed
33
+
34
+ | Tool | Purpose |
35
+ |---|---|
36
+ | `score_initiative` | Return classification (Accelerate/Fix/Stop), euro range, and reasoning for one initiative. |
37
+ | `validate_portfolio` | Check a BVF portfolio JSON against the v1.0 schema. |
38
+ | `get_benchmark` | Return the published benchmark base-rate and industry multiplier for a function + industry. |
39
+ | `list_taxonomy` | List the valid industries, functions, AI tiers, and readiness levels. |
40
+
41
+ ## Spec
42
+
43
+ <https://bvf-app.vercel.app/protocol>
44
+
45
+ ## License
46
+
47
+ MIT.
package/dist/index.js ADDED
@@ -0,0 +1,140 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * aibvf-mcp — an MCP server exposing AI BVF v1.0 scoring and validation as tools
4
+ * callable by any Claude agent or MCP-compatible host.
5
+ */
6
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
7
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
8
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
9
+ import { score, validate, BASE_RATES, IND_MULT, INDUSTRIES, FUNCTIONS, AI_TIERS, READINESS, BVF_VERSION, } from '@aibvf/core';
10
+ const server = new Server({ name: 'aibvf-mcp', version: '0.1.0' }, { capabilities: { tools: {} } });
11
+ const scoreInputSchema = {
12
+ type: 'object',
13
+ required: ['industry', 'revenue_eur', 'function', 'ai_tier', 'readiness', 'scores'],
14
+ properties: {
15
+ industry: { type: 'string', enum: INDUSTRIES, description: 'Your industry. See list_taxonomy if unsure.' },
16
+ revenue_eur: { type: 'number', minimum: 0, description: 'Approximate annual revenue in EUR.' },
17
+ function: { type: 'string', enum: FUNCTIONS, description: 'Business function where the AI will operate.' },
18
+ ai_tier: { type: 'string', enum: AI_TIERS, description: 'gen1=automation/RPA, gen2=GenAI, gen3=agentic.' },
19
+ readiness: { type: 'string', enum: READINESS, description: 'Organisational readiness. Honest self-assessment.' },
20
+ scores: {
21
+ type: 'object',
22
+ required: ['strategic_alignment', 'financial_return', 'change_enablement', 'governance_risk'],
23
+ properties: {
24
+ strategic_alignment: { type: 'number', minimum: 0, maximum: 100, description: 'How clearly this moves a board-level KPI (0-100).' },
25
+ financial_return: { type: 'number', minimum: 0, maximum: 100, description: 'Strength of modelled return (0-100).' },
26
+ change_enablement: { type: 'number', minimum: 0, maximum: 100, description: 'Sponsor, owner, funded change budget (0-100).' },
27
+ governance_risk: { type: 'number', minimum: 0, maximum: 100, description: 'Regulatory / reputational exposure. Higher = more risk (0-100).' },
28
+ },
29
+ },
30
+ },
31
+ };
32
+ const TOOLS = [
33
+ {
34
+ name: 'score_initiative',
35
+ description: 'Score a single AI initiative using AI BVF v1.0. Returns classification (Accelerate / Fix / Stop), modelled EUR value range, decision confidence, and reasoning. Use this as a pre-flight check before recommending any AI deployment.',
36
+ inputSchema: scoreInputSchema,
37
+ },
38
+ {
39
+ name: 'validate_portfolio',
40
+ description: 'Validate a portfolio JSON document against the AI BVF v1.0 schema. Returns valid=true or a list of errors with JSON paths.',
41
+ inputSchema: {
42
+ type: 'object',
43
+ required: ['portfolio'],
44
+ properties: { portfolio: { type: 'object', description: 'The portfolio JSON document to validate.' } },
45
+ },
46
+ },
47
+ {
48
+ name: 'get_benchmark',
49
+ description: 'Look up the published benchmark rates for a business function and industry. Returns revenue/cost ranges, industry multiplier, and the cited source.',
50
+ inputSchema: {
51
+ type: 'object',
52
+ required: ['function', 'industry'],
53
+ properties: {
54
+ function: { type: 'string', enum: FUNCTIONS },
55
+ industry: { type: 'string', enum: INDUSTRIES },
56
+ },
57
+ },
58
+ },
59
+ {
60
+ name: 'list_taxonomy',
61
+ description: 'Return the valid values for all AI BVF enums: industries, functions, AI tiers, and readiness levels.',
62
+ inputSchema: { type: 'object', properties: {} },
63
+ },
64
+ ];
65
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
66
+ server.setRequestHandler(CallToolRequestSchema, async (req) => {
67
+ const { name, arguments: args } = req.params;
68
+ try {
69
+ if (name === 'score_initiative') {
70
+ const r = score(args);
71
+ return {
72
+ content: [{
73
+ type: 'text',
74
+ text: JSON.stringify({
75
+ bvf_version: BVF_VERSION,
76
+ classification: r.classification,
77
+ reason: r.reason,
78
+ net_value_eur: { low: r.net_low_eur, high: r.net_high_eur },
79
+ gross_value_eur: { low: r.gross_low_eur, high: r.gross_high_eur },
80
+ decision_confidence: r.confidence,
81
+ multipliers: r.multipliers,
82
+ drivers: r.drivers,
83
+ benchmark_source: r.source,
84
+ }, null, 2),
85
+ }],
86
+ };
87
+ }
88
+ if (name === 'validate_portfolio') {
89
+ const result = validate(args.portfolio);
90
+ return {
91
+ content: [{
92
+ type: 'text',
93
+ text: JSON.stringify({ bvf_version: BVF_VERSION, ...result }, null, 2),
94
+ }],
95
+ };
96
+ }
97
+ if (name === 'get_benchmark') {
98
+ const { function: fn, industry } = args;
99
+ const base = BASE_RATES[fn];
100
+ const mult = (IND_MULT[industry] ?? IND_MULT.universal)[fn];
101
+ return {
102
+ content: [{
103
+ type: 'text',
104
+ text: JSON.stringify({
105
+ function: fn,
106
+ industry,
107
+ revenue_uplift_range: base.rev,
108
+ cost_takeout_range: base.cost,
109
+ industry_multiplier: mult,
110
+ drivers: base.drivers,
111
+ source: base.source,
112
+ }, null, 2),
113
+ }],
114
+ };
115
+ }
116
+ if (name === 'list_taxonomy') {
117
+ return {
118
+ content: [{
119
+ type: 'text',
120
+ text: JSON.stringify({
121
+ bvf_version: BVF_VERSION,
122
+ industries: INDUSTRIES,
123
+ functions: FUNCTIONS,
124
+ ai_tiers: AI_TIERS,
125
+ readiness: READINESS,
126
+ }, null, 2),
127
+ }],
128
+ };
129
+ }
130
+ throw new Error(`Unknown tool: ${name}`);
131
+ }
132
+ catch (err) {
133
+ const msg = err instanceof Error ? err.message : String(err);
134
+ return { content: [{ type: 'text', text: `Error: ${msg}` }], isError: true };
135
+ }
136
+ });
137
+ const transport = new StdioServerTransport();
138
+ await server.connect(transport);
139
+ console.error('aibvf-mcp v0.1.0 ready on stdio');
140
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "aibvf-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server exposing AI BVF v1.0 scoring and validation to any Claude agent.",
5
+ "keywords": ["mcp", "model-context-protocol", "ai-bvf", "claude", "agent", "ai-governance"],
6
+ "homepage": "https://bvf-app.vercel.app/protocol",
7
+ "repository": "github:craighorton/ai-bvf",
8
+ "license": "MIT",
9
+ "author": "Craig Horton",
10
+ "type": "module",
11
+ "main": "dist/index.js",
12
+ "bin": {
13
+ "aibvf-mcp": "dist/index.js"
14
+ },
15
+ "files": ["dist", "README.md"],
16
+ "scripts": {
17
+ "build": "tsc && node -e \"require('fs').chmodSync('dist/index.js', 0o755)\"",
18
+ "start": "node dist/index.js"
19
+ },
20
+ "dependencies": {
21
+ "@aibvf/core": "^0.1.0",
22
+ "@modelcontextprotocol/sdk": "^1.0.0"
23
+ },
24
+ "devDependencies": {
25
+ "typescript": "^5.4.0",
26
+ "@types/node": "^20.0.0"
27
+ }
28
+ }