@capivv/mcp-server 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.
Files changed (43) hide show
  1. package/README.md +124 -0
  2. package/dist/client.d.ts +31 -0
  3. package/dist/client.js +113 -0
  4. package/dist/config.d.ts +9 -0
  5. package/dist/config.js +16 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +28 -0
  8. package/dist/resources/concepts.d.ts +9 -0
  9. package/dist/resources/concepts.js +92 -0
  10. package/dist/resources/index.d.ts +3 -0
  11. package/dist/resources/index.js +8 -0
  12. package/dist/resources/rules.d.ts +3 -0
  13. package/dist/resources/rules.js +27 -0
  14. package/dist/resources/status.d.ts +3 -0
  15. package/dist/resources/status.js +43 -0
  16. package/dist/server.d.ts +3 -0
  17. package/dist/server.js +11 -0
  18. package/dist/tools/apply-rule.d.ts +3 -0
  19. package/dist/tools/apply-rule.js +37 -0
  20. package/dist/tools/create-offering.d.ts +3 -0
  21. package/dist/tools/create-offering.js +24 -0
  22. package/dist/tools/get-analytics.d.ts +3 -0
  23. package/dist/tools/get-analytics.js +29 -0
  24. package/dist/tools/import-products.d.ts +3 -0
  25. package/dist/tools/import-products.js +18 -0
  26. package/dist/tools/index.d.ts +3 -0
  27. package/dist/tools/index.js +22 -0
  28. package/dist/tools/list-apps.d.ts +3 -0
  29. package/dist/tools/list-apps.js +6 -0
  30. package/dist/tools/list-experiments.d.ts +3 -0
  31. package/dist/tools/list-experiments.js +34 -0
  32. package/dist/tools/list-offerings.d.ts +3 -0
  33. package/dist/tools/list-offerings.js +6 -0
  34. package/dist/tools/list-products.d.ts +3 -0
  35. package/dist/tools/list-products.js +16 -0
  36. package/dist/tools/list-rules.d.ts +3 -0
  37. package/dist/tools/list-rules.js +13 -0
  38. package/dist/tools/status.d.ts +3 -0
  39. package/dist/tools/status.js +62 -0
  40. package/dist/types.d.ts +184 -0
  41. package/dist/types.js +3 -0
  42. package/mcp.json +149 -0
  43. package/package.json +55 -0
@@ -0,0 +1,18 @@
1
+ import { z } from 'zod';
2
+ export function registerImportProductsTool(server, client) {
3
+ server.tool('capivv_import_products', 'Import products from connected App Store Connect or Google Play Console into Capivv. Returns a preview of what will be imported including suggested products, entitlements, and offerings.', { app_id: z.string().describe('App ID to import products for') }, async ({ app_id }) => {
4
+ const preview = await client.getImportPreview(app_id);
5
+ const newProducts = preview.suggestion.products.filter((p) => !p.already_exists);
6
+ const newEntitlements = preview.suggestion.entitlements.filter((e) => !e.already_exists);
7
+ const summary = {
8
+ new_products: newProducts.length,
9
+ new_entitlements: newEntitlements.length,
10
+ new_offerings: preview.suggestion.offerings.length,
11
+ existing_counts: preview.existing_counts,
12
+ warnings: preview.suggestion.warnings,
13
+ store_errors: preview.store_errors,
14
+ details: preview.suggestion,
15
+ };
16
+ return { content: [{ type: 'text', text: JSON.stringify(summary, null, 2) }] };
17
+ });
18
+ }
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { CapivvClient } from '../client.js';
3
+ export declare function registerAllTools(server: McpServer, client: CapivvClient): void;
@@ -0,0 +1,22 @@
1
+ import { registerStatusTool } from './status.js';
2
+ import { registerListAppsTool } from './list-apps.js';
3
+ import { registerListProductsTool } from './list-products.js';
4
+ import { registerImportProductsTool } from './import-products.js';
5
+ import { registerListOfferingsTool } from './list-offerings.js';
6
+ import { registerCreateOfferingTool } from './create-offering.js';
7
+ import { registerListRulesTool } from './list-rules.js';
8
+ import { registerApplyRuleTool } from './apply-rule.js';
9
+ import { registerListExperimentsTool } from './list-experiments.js';
10
+ import { registerGetAnalyticsTool } from './get-analytics.js';
11
+ export function registerAllTools(server, client) {
12
+ registerStatusTool(server, client);
13
+ registerListAppsTool(server, client);
14
+ registerListProductsTool(server, client);
15
+ registerImportProductsTool(server, client);
16
+ registerListOfferingsTool(server, client);
17
+ registerCreateOfferingTool(server, client);
18
+ registerListRulesTool(server, client);
19
+ registerApplyRuleTool(server, client);
20
+ registerListExperimentsTool(server, client);
21
+ registerGetAnalyticsTool(server, client);
22
+ }
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { CapivvClient } from '../client.js';
3
+ export declare function registerListAppsTool(server: McpServer, client: CapivvClient): void;
@@ -0,0 +1,6 @@
1
+ export function registerListAppsTool(server, client) {
2
+ server.tool('capivv_list_apps', 'List all apps registered in your Capivv account with their platform, bundle ID, and creation date.', async () => {
3
+ const apps = await client.listApps();
4
+ return { content: [{ type: 'text', text: JSON.stringify(apps, null, 2) }] };
5
+ });
6
+ }
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { CapivvClient } from '../client.js';
3
+ export declare function registerListExperimentsTool(server: McpServer, client: CapivvClient): void;
@@ -0,0 +1,34 @@
1
+ export function registerListExperimentsTool(server, client) {
2
+ server.tool('capivv_list_experiments', 'List A/B experiments with their status, variants, and current results including leading variant, confidence, and uplift.', async () => {
3
+ const [experiments, summaries] = await Promise.all([
4
+ client.listExperiments(),
5
+ client.getExperimentSummaries(),
6
+ ]);
7
+ const summaryMap = new Map(summaries.map((s) => [s.experiment_id, s]));
8
+ const merged = experiments.map((exp) => {
9
+ const summary = summaryMap.get(exp.id);
10
+ return {
11
+ id: exp.id,
12
+ name: exp.name,
13
+ status: exp.status,
14
+ target_metric: exp.target_metric,
15
+ variants: exp.variants.map((v) => ({
16
+ name: v.name,
17
+ is_control: v.is_control,
18
+ traffic_percent: v.traffic_percent,
19
+ conversion_rate: v.conversion_rate,
20
+ uplift_percent: v.uplift_percent,
21
+ })),
22
+ ...(summary
23
+ ? {
24
+ total_participants: summary.total_participants,
25
+ leading_variant: summary.leading_variant,
26
+ confidence: summary.confidence,
27
+ days_running: summary.days_running,
28
+ }
29
+ : {}),
30
+ };
31
+ });
32
+ return { content: [{ type: 'text', text: JSON.stringify(merged, null, 2) }] };
33
+ });
34
+ }
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { CapivvClient } from '../client.js';
3
+ export declare function registerListOfferingsTool(server: McpServer, client: CapivvClient): void;
@@ -0,0 +1,6 @@
1
+ export function registerListOfferingsTool(server, client) {
2
+ server.tool('capivv_list_offerings', 'List offerings (product bundles shown to users) with their packages and associated products.', async () => {
3
+ const offerings = await client.listOfferings();
4
+ return { content: [{ type: 'text', text: JSON.stringify(offerings, null, 2) }] };
5
+ });
6
+ }
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { CapivvClient } from '../client.js';
3
+ export declare function registerListProductsTool(server: McpServer, client: CapivvClient): void;
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ export function registerListProductsTool(server, client) {
3
+ server.tool('capivv_list_products', 'List products (in-app purchases and subscriptions) with their store IDs, types, and linked entitlements. Optionally filter by app.', { app_id: z.string().optional().describe('Filter products by app ID') }, async ({ app_id }) => {
4
+ const products = await client.listProducts(app_id);
5
+ const result = { products };
6
+ // E.4.1: Suggest creating offerings when products exist but none are configured
7
+ if (products.length > 0) {
8
+ const offerings = await client.listOfferings().catch(() => []);
9
+ if (offerings.length === 0) {
10
+ result._suggestion =
11
+ 'You have products but no offerings. Create an offering to bundle products for your paywall. Use the capivv_create_offering tool.';
12
+ }
13
+ }
14
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
15
+ });
16
+ }
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { CapivvClient } from '../client.js';
3
+ export declare function registerListRulesTool(server: McpServer, client: CapivvClient): void;
@@ -0,0 +1,13 @@
1
+ export function registerListRulesTool(server, client) {
2
+ server.tool('capivv_list_rules', 'List all YAML-based business rules with their status, priority, and last update time.', async () => {
3
+ const rules = await client.listRules();
4
+ const summary = rules.map((r) => ({
5
+ id: r.id,
6
+ name: r.name,
7
+ priority: r.priority,
8
+ is_enabled: r.is_enabled,
9
+ updated_at: r.updated_at,
10
+ }));
11
+ return { content: [{ type: 'text', text: JSON.stringify(summary, null, 2) }] };
12
+ });
13
+ }
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { CapivvClient } from '../client.js';
3
+ export declare function registerStatusTool(server: McpServer, client: CapivvClient): void;
@@ -0,0 +1,62 @@
1
+ const STEP_GUIDANCE = {
2
+ app_created: 'Create your first app with capivv_list_apps to see current apps, or create one in the Capivv dashboard.',
3
+ entitlement_created: 'Define entitlements to control feature access. Entitlements are granted when users purchase products.',
4
+ store_credentials_configured: 'Connect your App Store Connect or Google Play credentials in the Capivv dashboard under Settings > Developer > Integrations.',
5
+ product_created: 'Import products from your connected store using capivv_import_products, or create them manually in the dashboard.',
6
+ offering_created: 'Bundle your products into an offering using capivv_create_offering. Offerings are what your paywall displays.',
7
+ sdk_key_viewed: 'Generate an API key in the Capivv dashboard under Settings > Developer > API Keys, then integrate the SDK.',
8
+ store_connected: 'Connect your app store credentials to enable automatic product import.',
9
+ import_reviewed: 'Review the suggested imports using capivv_import_products to see what will be created.',
10
+ import_completed: 'Approve and run the import to create all suggested entities.',
11
+ };
12
+ export function registerStatusTool(server, client) {
13
+ server.tool('capivv_status', 'Get the current status of your Capivv subscription platform including setup progress, resource counts, and key metrics.', async () => {
14
+ const [apps, products, entitlements, offerings, rules, onboarding, analytics] = await Promise.allSettled([
15
+ client.listApps(),
16
+ client.listProducts(),
17
+ client.listEntitlements(),
18
+ client.listOfferings(),
19
+ client.listRules(),
20
+ client.getOnboarding(),
21
+ client.getAnalyticsOverview(),
22
+ ]);
23
+ const count = (r) => r.status === 'fulfilled' ? r.value.length : 0;
24
+ const result = {
25
+ resources: {
26
+ apps: count(apps),
27
+ products: count(products),
28
+ entitlements: count(entitlements),
29
+ offerings: count(offerings),
30
+ rules: count(rules),
31
+ },
32
+ };
33
+ if (onboarding.status === 'fulfilled') {
34
+ const ob = onboarding.value;
35
+ result.onboarding = {
36
+ is_complete: ob.is_complete,
37
+ completed_steps: ob.completed_steps,
38
+ total_steps: ob.total_steps,
39
+ next_step: ob.next_step,
40
+ };
41
+ // E.4.2: Include next step guidance when setup is incomplete
42
+ if (!ob.is_complete && ob.next_step) {
43
+ const guidance = STEP_GUIDANCE[ob.next_step];
44
+ if (guidance) {
45
+ result._suggestion = `Setup incomplete (${ob.completed_steps}/${ob.total_steps}). Next step: ${guidance}`;
46
+ }
47
+ }
48
+ }
49
+ if (analytics.status === 'fulfilled') {
50
+ const a = analytics.value;
51
+ result.analytics = {
52
+ mrr: a.mrr_formatted,
53
+ arr: a.arr_formatted,
54
+ active_subscriptions: a.active_subscriptions,
55
+ trialing_subscriptions: a.trialing_subscriptions,
56
+ churn_rate: a.churn_rate,
57
+ arpu: a.arpu_formatted,
58
+ };
59
+ }
60
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
61
+ });
62
+ }
@@ -0,0 +1,184 @@
1
+ export interface App {
2
+ id: string;
3
+ name: string;
4
+ platform: string;
5
+ bundle_id: string;
6
+ archived_at: string | null;
7
+ created_at: string;
8
+ updated_at: string;
9
+ }
10
+ export interface Product {
11
+ id: string;
12
+ app_id: string;
13
+ external_id: string;
14
+ product_type: string;
15
+ display_name: string;
16
+ description: string | null;
17
+ entitlement_ids: string[];
18
+ created_at: string;
19
+ updated_at: string;
20
+ }
21
+ export interface Entitlement {
22
+ id: string;
23
+ identifier: string;
24
+ display_name: string;
25
+ description: string | null;
26
+ created_at: string;
27
+ updated_at: string;
28
+ }
29
+ export interface Package {
30
+ identifier: string;
31
+ product_id: string;
32
+ display_name: string;
33
+ package_type: string;
34
+ position: number;
35
+ }
36
+ export interface Offering {
37
+ id: string;
38
+ app_id: string;
39
+ identifier: string;
40
+ display_name: string;
41
+ description: string | null;
42
+ is_default: boolean;
43
+ packages: Package[];
44
+ created_at: string;
45
+ updated_at: string;
46
+ }
47
+ export interface Rule {
48
+ id: string;
49
+ name: string;
50
+ content: string;
51
+ priority: number;
52
+ is_enabled: boolean;
53
+ updated_at: string;
54
+ }
55
+ export interface ExperimentVariant {
56
+ id: string;
57
+ name: string;
58
+ is_control: boolean;
59
+ traffic_percent: number;
60
+ sample_size: number;
61
+ conversion_count: number;
62
+ conversion_rate: number | null;
63
+ uplift_percent: number | null;
64
+ }
65
+ export interface Experiment {
66
+ id: string;
67
+ name: string;
68
+ description: string | null;
69
+ status: string;
70
+ target_metric: string | null;
71
+ start_date: string | null;
72
+ end_date: string | null;
73
+ confidence_level: number;
74
+ variants: ExperimentVariant[];
75
+ }
76
+ export interface ExperimentSummary {
77
+ experiment_id: string;
78
+ experiment_name: string;
79
+ status: string;
80
+ total_participants: number;
81
+ leading_variant: string | null;
82
+ uplift: number | null;
83
+ confidence: number | null;
84
+ days_running: number;
85
+ }
86
+ export interface PeriodComparison {
87
+ mrr_change_percent: number;
88
+ subscriptions_change_percent: number;
89
+ }
90
+ export interface AnalyticsOverview {
91
+ mrr: number;
92
+ mrr_formatted: string;
93
+ arr: number;
94
+ arr_formatted: string;
95
+ active_subscriptions: number;
96
+ trialing_subscriptions: number;
97
+ churn_rate: number;
98
+ arpu: number;
99
+ arpu_formatted: string;
100
+ period_comparison: PeriodComparison | null;
101
+ }
102
+ export interface OnboardingProgress {
103
+ onboarding_mode: string;
104
+ welcome_seen: boolean;
105
+ app_created: boolean;
106
+ entitlement_created: boolean;
107
+ store_credentials_configured: boolean;
108
+ product_created: boolean;
109
+ offering_created: boolean;
110
+ sdk_key_viewed: boolean;
111
+ store_connected: boolean;
112
+ import_reviewed: boolean;
113
+ import_completed: boolean;
114
+ }
115
+ export interface OnboardingResponse {
116
+ progress: OnboardingProgress;
117
+ is_complete: boolean;
118
+ completed_steps: number;
119
+ total_steps: number;
120
+ next_step: string | null;
121
+ }
122
+ export interface SuggestedProduct {
123
+ external_id: string;
124
+ product_type: string;
125
+ display_name: string;
126
+ source: string;
127
+ already_exists: boolean;
128
+ }
129
+ export interface SuggestedEntitlement {
130
+ identifier: string;
131
+ display_name: string;
132
+ already_exists: boolean;
133
+ }
134
+ export interface SuggestedOffering {
135
+ identifier: string;
136
+ display_name: string;
137
+ is_default: boolean;
138
+ }
139
+ export interface ImportSuggestion {
140
+ products: SuggestedProduct[];
141
+ entitlements: SuggestedEntitlement[];
142
+ offerings: SuggestedOffering[];
143
+ warnings: string[];
144
+ }
145
+ export interface ExistingEntityCounts {
146
+ apps: number;
147
+ products: number;
148
+ entitlements: number;
149
+ offerings: number;
150
+ }
151
+ export interface StoreError {
152
+ source: string;
153
+ message: string;
154
+ }
155
+ export interface ImportPreviewResponse {
156
+ suggestion: ImportSuggestion;
157
+ existing_counts: ExistingEntityCounts;
158
+ store_errors: StoreError[];
159
+ }
160
+ export interface CreateOfferingRequest {
161
+ app_id: string;
162
+ identifier: string;
163
+ display_name: string;
164
+ description?: string;
165
+ is_default?: boolean;
166
+ packages: Array<{
167
+ identifier: string;
168
+ product_id: string;
169
+ display_name: string;
170
+ package_type: string;
171
+ position: number;
172
+ }>;
173
+ }
174
+ export interface CreateRuleRequest {
175
+ name: string;
176
+ content: string;
177
+ priority: number;
178
+ is_enabled: boolean;
179
+ }
180
+ export interface ValidateRuleResponse {
181
+ is_valid: boolean;
182
+ errors: string[];
183
+ warnings: string[];
184
+ }
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ // API response types mirrored from crates/capivv-cli/src/client.rs
2
+ // and dashboard/src/types/api.ts
3
+ export {};
package/mcp.json ADDED
@@ -0,0 +1,149 @@
1
+ {
2
+ "name": "@capivv/mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for managing Capivv subscription platform via AI assistants",
5
+ "transport": "stdio",
6
+ "command": "npx",
7
+ "args": ["-y", "@capivv/mcp-server"],
8
+ "env": {
9
+ "CAPIVV_API_KEY": {
10
+ "required": true,
11
+ "description": "API key from the Capivv dashboard (Settings > Developer > API Keys)"
12
+ },
13
+ "CAPIVV_API_URL": {
14
+ "required": false,
15
+ "description": "API base URL (default: https://api.capivv.com)"
16
+ },
17
+ "CAPIVV_ORG_ID": {
18
+ "required": false,
19
+ "description": "Organization ID for multi-org accounts"
20
+ }
21
+ },
22
+ "tools": [
23
+ {
24
+ "name": "capivv_status",
25
+ "description": "Get the current status of your Capivv subscription platform including setup progress, resource counts, and key metrics."
26
+ },
27
+ {
28
+ "name": "capivv_list_apps",
29
+ "description": "List all apps registered in your Capivv account with their platform, bundle ID, and creation date."
30
+ },
31
+ {
32
+ "name": "capivv_list_products",
33
+ "description": "List products (in-app purchases and subscriptions) with their store IDs, types, and linked entitlements. Optionally filter by app.",
34
+ "inputSchema": {
35
+ "type": "object",
36
+ "properties": {
37
+ "app_id": {
38
+ "type": "string",
39
+ "description": "Filter products by app ID"
40
+ }
41
+ }
42
+ }
43
+ },
44
+ {
45
+ "name": "capivv_import_products",
46
+ "description": "Import products from connected App Store Connect or Google Play Console into Capivv. Returns a preview of what will be imported including suggested products, entitlements, and offerings.",
47
+ "inputSchema": {
48
+ "type": "object",
49
+ "properties": {
50
+ "app_id": {
51
+ "type": "string",
52
+ "description": "App ID to import products for"
53
+ }
54
+ },
55
+ "required": ["app_id"]
56
+ }
57
+ },
58
+ {
59
+ "name": "capivv_list_offerings",
60
+ "description": "List offerings (product bundles shown to users) with their packages and associated products."
61
+ },
62
+ {
63
+ "name": "capivv_create_offering",
64
+ "description": "Create a new offering to bundle products for your paywall. Specify products and their display order.",
65
+ "inputSchema": {
66
+ "type": "object",
67
+ "properties": {
68
+ "app_id": {
69
+ "type": "string",
70
+ "description": "App ID"
71
+ },
72
+ "identifier": {
73
+ "type": "string",
74
+ "description": "Unique identifier for the offering"
75
+ },
76
+ "display_name": {
77
+ "type": "string",
78
+ "description": "Display name for the offering"
79
+ },
80
+ "packages": {
81
+ "type": "array",
82
+ "description": "Packages in the offering",
83
+ "items": {
84
+ "type": "object",
85
+ "properties": {
86
+ "identifier": { "type": "string" },
87
+ "display_name": { "type": "string" },
88
+ "product_id": { "type": "string" },
89
+ "package_type": { "type": "string" }
90
+ },
91
+ "required": ["identifier", "display_name", "product_id", "package_type"]
92
+ }
93
+ }
94
+ },
95
+ "required": ["app_id", "identifier", "display_name", "packages"]
96
+ }
97
+ },
98
+ {
99
+ "name": "capivv_list_rules",
100
+ "description": "List all YAML-based business rules with their status, priority, and last update time."
101
+ },
102
+ {
103
+ "name": "capivv_apply_rule",
104
+ "description": "Apply a YAML rule configuration. Validates the rule first, then creates or updates it. Returns validation errors if the YAML is invalid.",
105
+ "inputSchema": {
106
+ "type": "object",
107
+ "properties": {
108
+ "name": {
109
+ "type": "string",
110
+ "description": "Rule name"
111
+ },
112
+ "yaml_content": {
113
+ "type": "string",
114
+ "description": "YAML rule content"
115
+ }
116
+ },
117
+ "required": ["name", "yaml_content"]
118
+ }
119
+ },
120
+ {
121
+ "name": "capivv_list_experiments",
122
+ "description": "List A/B experiments with their status, variants, and current results including leading variant, confidence, and uplift."
123
+ },
124
+ {
125
+ "name": "capivv_get_analytics",
126
+ "description": "Get key subscription business metrics: MRR, ARR, active subscriptions, churn rate, ARPU, and period-over-period comparison."
127
+ }
128
+ ],
129
+ "resources": [
130
+ {
131
+ "uri": "capivv://status",
132
+ "name": "status",
133
+ "description": "Current Capivv platform status as JSON including resource counts, onboarding progress, and analytics.",
134
+ "mimeType": "application/json"
135
+ },
136
+ {
137
+ "uriTemplate": "capivv://rules/{ruleId}",
138
+ "name": "rule",
139
+ "description": "Individual rule YAML content by rule ID.",
140
+ "mimeType": "text/yaml"
141
+ },
142
+ {
143
+ "uri": "capivv://docs/concepts",
144
+ "name": "concepts",
145
+ "description": "Glossary of Capivv subscription platform concepts (15 terms).",
146
+ "mimeType": "application/json"
147
+ }
148
+ ]
149
+ }
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@capivv/mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for managing Capivv subscription platform via AI assistants",
5
+ "type": "module",
6
+ "bin": {
7
+ "capivv-mcp": "./dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "files": [
12
+ "dist/",
13
+ "mcp.json",
14
+ "README.md"
15
+ ],
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/capivv/capivv.git",
22
+ "directory": "packages/mcp-server"
23
+ },
24
+ "homepage": "https://github.com/capivv/capivv/tree/main/packages/mcp-server",
25
+ "license": "MIT",
26
+ "keywords": [
27
+ "mcp",
28
+ "model-context-protocol",
29
+ "capivv",
30
+ "subscriptions",
31
+ "in-app-purchases"
32
+ ],
33
+ "author": "Capivv Team",
34
+ "scripts": {
35
+ "build": "tsc",
36
+ "dev": "tsx src/index.ts",
37
+ "test": "vitest run",
38
+ "test:watch": "vitest",
39
+ "typecheck": "tsc --noEmit",
40
+ "prepublishOnly": "npm run build"
41
+ },
42
+ "dependencies": {
43
+ "@modelcontextprotocol/sdk": "^1.26.0",
44
+ "zod": "^4.0.0"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^20.0.0",
48
+ "tsx": "^4.0.0",
49
+ "typescript": "^5.0.0",
50
+ "vitest": "^3.0.0"
51
+ },
52
+ "engines": {
53
+ "node": ">=18"
54
+ }
55
+ }