@page-mcp/vue2 2.0.0 → 3.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 +44 -67
- package/README.zh-CN.md +72 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -5
- package/dist/index.d.ts +7 -5
- package/dist/index.js.map +1 -1
- package/package.json +7 -4
package/README.md
CHANGED
|
@@ -1,95 +1,72 @@
|
|
|
1
1
|
# @page-mcp/vue2
|
|
2
2
|
|
|
3
|
-
Vue 2
|
|
3
|
+
Vue 2 integration package for Page MCP. Use it when you want Page MCP to fit Vue 2 application structure through a plugin and mixin-based registration model.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## What This Package Does
|
|
6
|
+
|
|
7
|
+
- exposes a Vue 2 plugin
|
|
8
|
+
- exposes a mixin for automatic registration from component options
|
|
9
|
+
- exposes `this.$pageMcp` runtime access
|
|
10
|
+
|
|
11
|
+
## When To Use It
|
|
12
|
+
|
|
13
|
+
Use `@page-mcp/vue2` when:
|
|
14
|
+
|
|
15
|
+
- your app is built with Vue 2
|
|
16
|
+
- you want registration through component options or mixins
|
|
17
|
+
- you want a Vue 2-friendly wrapper around `@page-mcp/core`
|
|
18
|
+
|
|
19
|
+
Use `@page-mcp/core` directly outside Vue 2.
|
|
6
20
|
|
|
7
21
|
## Installation
|
|
8
22
|
|
|
9
23
|
```bash
|
|
10
|
-
npm install @page-mcp/core
|
|
24
|
+
npm install @page-mcp/core
|
|
25
|
+
npm install @page-mcp/protocol
|
|
26
|
+
npm install @page-mcp/vue2
|
|
11
27
|
```
|
|
12
28
|
|
|
13
|
-
##
|
|
14
|
-
|
|
15
|
-
### 1. Install Plugin
|
|
29
|
+
## Minimal Example
|
|
16
30
|
|
|
17
|
-
```
|
|
18
|
-
// main.js
|
|
31
|
+
```js
|
|
19
32
|
import Vue from 'vue';
|
|
20
33
|
import { PageMcpPlugin } from '@page-mcp/vue2';
|
|
21
34
|
|
|
22
|
-
Vue.use(PageMcpPlugin, { name: '
|
|
35
|
+
Vue.use(PageMcpPlugin, { name: 'demo-app', version: '1.0.0' });
|
|
23
36
|
```
|
|
24
37
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
Declare tools, resources, and skills directly in component options. They are auto-registered on `created` and cleaned up on `beforeDestroy`.
|
|
28
|
-
|
|
29
|
-
```javascript
|
|
38
|
+
```js
|
|
30
39
|
export default {
|
|
31
40
|
pageMcpTools: [
|
|
32
41
|
{
|
|
33
|
-
name: '
|
|
34
|
-
description: '
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
42
|
+
name: 'search_products',
|
|
43
|
+
description: 'Search products by keyword',
|
|
44
|
+
execute: async function(input) {
|
|
45
|
+
return [{ keyword: String(input.keyword || '') }];
|
|
46
|
+
},
|
|
47
|
+
},
|
|
38
48
|
],
|
|
39
|
-
|
|
40
|
-
pageMcpResources: [
|
|
41
|
-
{
|
|
42
|
-
uri: 'page://table/data',
|
|
43
|
-
name: 'Table Data',
|
|
44
|
-
description: 'Data displayed in the table',
|
|
45
|
-
handler: async () => ({ rows: store.state.tableData })
|
|
46
|
-
}
|
|
47
|
-
]
|
|
48
|
-
};
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
### 2. Option B: Use `this.$pageMcp` Directly
|
|
52
|
-
|
|
53
|
-
```javascript
|
|
54
|
-
export default {
|
|
55
|
-
methods: {
|
|
56
|
-
async init() {
|
|
57
|
-
// Register a tool
|
|
58
|
-
this.$pageMcp.host.registerTool({
|
|
59
|
-
name: 'search',
|
|
60
|
-
description: 'Search records',
|
|
61
|
-
inputSchema: { type: 'object', properties: { q: { type: 'string' } } },
|
|
62
|
-
execute: async (args) => this.doSearch(args.q)
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
// Discover tools from AI side
|
|
66
|
-
const tools = await this.$pageMcp.client.toolsList();
|
|
67
|
-
console.log('Available tools:', tools);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
49
|
};
|
|
71
50
|
```
|
|
72
51
|
|
|
73
|
-
##
|
|
52
|
+
## Core Exports
|
|
74
53
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
| `this.$pageMcp.client` | `PageMcpClient` instance |
|
|
79
|
-
| `this.$pageMcp.skills` | Extensions skills client |
|
|
80
|
-
| `this.$pageMcp.bus` | `EventBus` instance |
|
|
81
|
-
| `pageMcpTools` option | Array of tools auto-registered on component create |
|
|
82
|
-
| `pageMcpResources` option | Array of resources auto-registered on component create |
|
|
83
|
-
| `pageMcpSkills` option | Array of skills auto-registered on component create |
|
|
54
|
+
- `PageMcpPlugin`
|
|
55
|
+
- `pageMcpMixin`
|
|
56
|
+
- runtime access through `this.$pageMcp`
|
|
84
57
|
|
|
85
|
-
|
|
58
|
+
`this.$pageMcp` exposes:
|
|
86
59
|
|
|
87
|
-
- `
|
|
88
|
-
-
|
|
89
|
-
-
|
|
60
|
+
- `host`
|
|
61
|
+
- `client`
|
|
62
|
+
- `skills`
|
|
63
|
+
- `bus`
|
|
90
64
|
|
|
91
|
-
|
|
65
|
+
## Relationship To Other Packages
|
|
92
66
|
|
|
93
|
-
|
|
67
|
+
- `@page-mcp/core`
|
|
68
|
+
- runtime implementation
|
|
69
|
+
- `@page-mcp/protocol`
|
|
70
|
+
- protocol types for registration and metadata
|
|
94
71
|
|
|
95
|
-
|
|
72
|
+
Use this package for Vue 2 integration ergonomics, not as the low-level runtime.
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# @page-mcp/vue2
|
|
2
|
+
|
|
3
|
+
Page MCP 的 Vue 2 集成包。需要通过 plugin 和 mixin 这种更符合 Vue 2 的方式接入 Page MCP 时,使用这个包。
|
|
4
|
+
|
|
5
|
+
## 这个包负责什么
|
|
6
|
+
|
|
7
|
+
- 提供 Vue 2 plugin
|
|
8
|
+
- 提供基于组件选项自动注册的 mixin
|
|
9
|
+
- 通过 `this.$pageMcp` 暴露运行时访问入口
|
|
10
|
+
|
|
11
|
+
## 什么时候用它
|
|
12
|
+
|
|
13
|
+
以下场景使用 `@page-mcp/vue2`:
|
|
14
|
+
|
|
15
|
+
- 你的应用基于 Vue 2
|
|
16
|
+
- 希望通过组件选项或 mixin 来注册能力
|
|
17
|
+
- 希望用 Vue 2 习惯的方式包裹 `@page-mcp/core`
|
|
18
|
+
|
|
19
|
+
如果不在 Vue 2 中使用,直接用 `@page-mcp/core` 即可。
|
|
20
|
+
|
|
21
|
+
## 安装
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install @page-mcp/core
|
|
25
|
+
npm install @page-mcp/protocol
|
|
26
|
+
npm install @page-mcp/vue2
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 最小示例
|
|
30
|
+
|
|
31
|
+
```js
|
|
32
|
+
import Vue from 'vue';
|
|
33
|
+
import { PageMcpPlugin } from '@page-mcp/vue2';
|
|
34
|
+
|
|
35
|
+
Vue.use(PageMcpPlugin, { name: 'demo-app', version: '1.0.0' });
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
```js
|
|
39
|
+
export default {
|
|
40
|
+
pageMcpTools: [
|
|
41
|
+
{
|
|
42
|
+
name: 'search_products',
|
|
43
|
+
description: 'Search products by keyword',
|
|
44
|
+
execute: async function(input) {
|
|
45
|
+
return [{ keyword: String(input.keyword || '') }];
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
};
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 核心导出
|
|
53
|
+
|
|
54
|
+
- `PageMcpPlugin`
|
|
55
|
+
- `pageMcpMixin`
|
|
56
|
+
- 通过 `this.$pageMcp` 访问运行时对象
|
|
57
|
+
|
|
58
|
+
`this.$pageMcp` 提供:
|
|
59
|
+
|
|
60
|
+
- `host`
|
|
61
|
+
- `client`
|
|
62
|
+
- `skills`
|
|
63
|
+
- `bus`
|
|
64
|
+
|
|
65
|
+
## 与其他包的关系
|
|
66
|
+
|
|
67
|
+
- `@page-mcp/core`
|
|
68
|
+
- 运行时实现
|
|
69
|
+
- `@page-mcp/protocol`
|
|
70
|
+
- 注册定义和元数据所需的协议类型
|
|
71
|
+
|
|
72
|
+
这个包负责 Vue 2 的接入体验,不是底层运行时本身。
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ============================================================\n// @page-mcp/vue2 — Vue 2 Adapter for Page MCP SDK\n// ============================================================\n\nimport {\n Extensions,\n PageMcpHost,\n PageMcpClient,\n EventBus,\n type
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ============================================================\n// @page-mcp/vue2 — Vue 2 Adapter for Page MCP SDK\n// ============================================================\n\nimport {\n Extensions,\n PageMcpHost,\n PageMcpClient,\n EventBus,\n type SkillDefinition,\n type HostInfo,\n} from '@page-mcp/core';\nimport type {\n PageMcpToolDefinition,\n PageMcpResourceDefinition,\n PageMcpPromptDefinition,\n AnthropicMcpTool,\n AnthropicMcpResource,\n AnthropicMcpPrompt,\n} from '@page-mcp/protocol';\n\n// ------ Types for Vue 2 ------\n\ninterface Vue2ComponentOptions {\n beforeCreate?: () => void;\n created?: () => void;\n beforeDestroy?: () => void;\n [key: string]: unknown;\n}\n\ninterface Vue2Instance {\n $pageMcp?: PageMcpInjection;\n $options: {\n pageMcpTools?: PageMcpToolDefinition[];\n pageMcpResources?: PageMcpResourceDefinition[];\n pageMcpSkills?: SkillDefinition[];\n pageMcpPrompts?: PageMcpPromptDefinition[];\n parent?: Vue2Instance;\n [key: string]: unknown;\n };\n $root: Vue2Instance;\n __pageMcpRegistered?: {\n tools: string[];\n resources: string[];\n skills: string[];\n prompts: string[];\n };\n [key: string]: unknown;\n}\n\ninterface Vue2Constructor {\n mixin(mixin: Vue2ComponentOptions): void;\n prototype: Vue2Instance;\n [key: string]: unknown;\n}\n\ninterface PageMcpInjection {\n host: PageMcpHost;\n client: PageMcpClient;\n skills: InstanceType<typeof Extensions.SkillsClient>;\n bus: EventBus;\n hostInfo: HostInfo;\n}\n\n// ------ Plugin ------\n\nexport interface PageMcpPluginOptions {\n name: string;\n version: string;\n bus?: EventBus;\n}\n\n/**\n * Vue 2 Plugin. Install globally:\n *\n * ```js\n * import Vue from 'vue';\n * import { PageMcpPlugin } from '@page-mcp/vue2';\n *\n * Vue.use(PageMcpPlugin, { name: 'my-app', version: '1.0' });\n * ```\n *\n * After installation, `this.$pageMcp` is available in all components:\n * - `this.$pageMcp.host` — PageMcpHost instance\n * - `this.$pageMcp.client` — PageMcpClient instance\n * - `this.$pageMcp.bus` — EventBus instance\n */\nexport const PageMcpPlugin = {\n install(Vue: Vue2Constructor, options: PageMcpPluginOptions): void {\n const bus = options.bus ?? new EventBus();\n const host = new PageMcpHost({ name: options.name, version: options.version, bus });\n const client = new PageMcpClient({ bus });\n const skills = Extensions.createSkillsClient(client);\n const hostInfo: HostInfo = { name: options.name, version: options.version };\n\n host.start();\n client.connect();\n\n const injection: PageMcpInjection = { host, client, skills, bus, hostInfo };\n\n // Make $pageMcp available in all components\n Vue.prototype.$pageMcp = injection;\n\n // Install the auto-registration mixin\n Vue.mixin(pageMcpAutoRegisterMixin);\n },\n};\n\n// ------ Mixin ------\n\n/**\n * Mixin that auto-registers tools/resources/skills defined in component options.\n *\n * ```js\n * export default {\n * pageMcpTools: [\n * {\n * name: 'search',\n * description: 'Search products',\n * parameters: { type: 'object', properties: { q: { type: 'string' } } },\n * handler: async (args) => this.searchProducts(args.q),\n * }\n * ],\n * pageMcpResources: [...],\n * pageMcpSkills: [...],\n * }\n * ```\n */\nconst pageMcpAutoRegisterMixin: Vue2ComponentOptions = {\n created(this: Vue2Instance) {\n const pageMcp = this.$pageMcp;\n if (!pageMcp) return;\n\n const { host } = pageMcp;\n this.__pageMcpRegistered = {\n tools: [],\n resources: [],\n skills: [],\n prompts: [],\n };\n\n // Register tools from component options\n const tools = this.$options.pageMcpTools;\n if (tools && Array.isArray(tools)) {\n for (const tool of tools) {\n try {\n host.registerTool(tool);\n this.__pageMcpRegistered.tools.push(tool.name);\n } catch {\n // Already registered\n }\n }\n }\n\n // Register resources from component options\n const resources = this.$options.pageMcpResources;\n if (resources && Array.isArray(resources)) {\n for (const resource of resources) {\n try {\n host.registerResource(resource);\n this.__pageMcpRegistered.resources.push(resource.uri);\n } catch {\n // Already registered\n }\n }\n }\n\n // Register skills from component options\n const skills = this.$options.pageMcpSkills;\n if (skills && Array.isArray(skills)) {\n for (const skill of skills) {\n try {\n host.registerSkill(skill);\n this.__pageMcpRegistered.skills.push(skill.name);\n } catch {\n // Already registered\n }\n }\n }\n\n // Register prompts from component options\n const prompts = this.$options.pageMcpPrompts;\n if (prompts && Array.isArray(prompts)) {\n for (const prompt of prompts) {\n try {\n host.registerPrompt(prompt);\n this.__pageMcpRegistered.prompts.push(prompt.name);\n } catch {\n // Already registered\n }\n }\n }\n },\n beforeDestroy(this: Vue2Instance) {\n const pageMcp = this.$pageMcp;\n const registered = this.__pageMcpRegistered;\n if (!pageMcp || !registered) return;\n const { host } = pageMcp;\n\n for (const name of registered.tools) {\n try { host.unregisterTool(name); } catch { /* noop */ }\n }\n for (const uri of registered.resources) {\n try { host.unregisterResource(uri); } catch { /* noop */ }\n }\n for (const name of registered.skills) {\n try { host.unregisterSkill(name); } catch { /* noop */ }\n }\n for (const name of registered.prompts) {\n try { host.unregisterPrompt(name); } catch { /* noop */ }\n }\n },\n};\n\n/**\n * Standalone mixin for manual use (without the plugin).\n * Useful when you want to use the mixin pattern explicitly.\n */\nexport { pageMcpAutoRegisterMixin as pageMcpMixin };\n\n// ------ Re-exports ------\n\nexport {\n Extensions,\n PageMcpHost,\n PageMcpClient,\n EventBus,\n} from '@page-mcp/core';\n\nexport type {\n SkillDefinition,\n SkillInfo,\n SkillGetResult,\n SkillExecutionResult,\n SkillExecutionContext,\n HostInfo,\n} from '@page-mcp/core';\nexport type {\n PageMcpToolDefinition,\n PageMcpResourceDefinition,\n PageMcpPromptDefinition,\n AnthropicMcpTool,\n AnthropicMcpResource,\n AnthropicMcpPrompt,\n} from '@page-mcp/protocol';\n"],"mappings":"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","names":["import_core"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { PageMcpHost, PageMcpClient, Extensions, EventBus, HostInfo,
|
|
2
|
-
export { EventBus, Extensions, HostInfo, PageMcpClient, PageMcpHost,
|
|
1
|
+
import { PageMcpHost, PageMcpClient, Extensions, EventBus, HostInfo, SkillDefinition } from '@page-mcp/core';
|
|
2
|
+
export { EventBus, Extensions, HostInfo, PageMcpClient, PageMcpHost, SkillDefinition, SkillExecutionContext, SkillExecutionResult, SkillGetResult, SkillInfo } from '@page-mcp/core';
|
|
3
|
+
import { PageMcpToolDefinition, PageMcpResourceDefinition, PageMcpPromptDefinition } from '@page-mcp/protocol';
|
|
4
|
+
export { AnthropicMcpPrompt, AnthropicMcpResource, AnthropicMcpTool, PageMcpPromptDefinition, PageMcpResourceDefinition, PageMcpToolDefinition } from '@page-mcp/protocol';
|
|
3
5
|
|
|
4
6
|
interface Vue2ComponentOptions {
|
|
5
7
|
beforeCreate?: () => void;
|
|
@@ -10,10 +12,10 @@ interface Vue2ComponentOptions {
|
|
|
10
12
|
interface Vue2Instance {
|
|
11
13
|
$pageMcp?: PageMcpInjection;
|
|
12
14
|
$options: {
|
|
13
|
-
pageMcpTools?:
|
|
14
|
-
pageMcpResources?:
|
|
15
|
+
pageMcpTools?: PageMcpToolDefinition[];
|
|
16
|
+
pageMcpResources?: PageMcpResourceDefinition[];
|
|
15
17
|
pageMcpSkills?: SkillDefinition[];
|
|
16
|
-
pageMcpPrompts?:
|
|
18
|
+
pageMcpPrompts?: PageMcpPromptDefinition[];
|
|
17
19
|
parent?: Vue2Instance;
|
|
18
20
|
[key: string]: unknown;
|
|
19
21
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { PageMcpHost, PageMcpClient, Extensions, EventBus, HostInfo,
|
|
2
|
-
export { EventBus, Extensions, HostInfo, PageMcpClient, PageMcpHost,
|
|
1
|
+
import { PageMcpHost, PageMcpClient, Extensions, EventBus, HostInfo, SkillDefinition } from '@page-mcp/core';
|
|
2
|
+
export { EventBus, Extensions, HostInfo, PageMcpClient, PageMcpHost, SkillDefinition, SkillExecutionContext, SkillExecutionResult, SkillGetResult, SkillInfo } from '@page-mcp/core';
|
|
3
|
+
import { PageMcpToolDefinition, PageMcpResourceDefinition, PageMcpPromptDefinition } from '@page-mcp/protocol';
|
|
4
|
+
export { AnthropicMcpPrompt, AnthropicMcpResource, AnthropicMcpTool, PageMcpPromptDefinition, PageMcpResourceDefinition, PageMcpToolDefinition } from '@page-mcp/protocol';
|
|
3
5
|
|
|
4
6
|
interface Vue2ComponentOptions {
|
|
5
7
|
beforeCreate?: () => void;
|
|
@@ -10,10 +12,10 @@ interface Vue2ComponentOptions {
|
|
|
10
12
|
interface Vue2Instance {
|
|
11
13
|
$pageMcp?: PageMcpInjection;
|
|
12
14
|
$options: {
|
|
13
|
-
pageMcpTools?:
|
|
14
|
-
pageMcpResources?:
|
|
15
|
+
pageMcpTools?: PageMcpToolDefinition[];
|
|
16
|
+
pageMcpResources?: PageMcpResourceDefinition[];
|
|
15
17
|
pageMcpSkills?: SkillDefinition[];
|
|
16
|
-
pageMcpPrompts?:
|
|
18
|
+
pageMcpPrompts?: PageMcpPromptDefinition[];
|
|
17
19
|
parent?: Vue2Instance;
|
|
18
20
|
[key: string]: unknown;
|
|
19
21
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ============================================================\n// @page-mcp/vue2 — Vue 2 Adapter for Page MCP SDK\n// ============================================================\n\nimport {\n Extensions,\n PageMcpHost,\n PageMcpClient,\n EventBus,\n type
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ============================================================\n// @page-mcp/vue2 — Vue 2 Adapter for Page MCP SDK\n// ============================================================\n\nimport {\n Extensions,\n PageMcpHost,\n PageMcpClient,\n EventBus,\n type SkillDefinition,\n type HostInfo,\n} from '@page-mcp/core';\nimport type {\n PageMcpToolDefinition,\n PageMcpResourceDefinition,\n PageMcpPromptDefinition,\n AnthropicMcpTool,\n AnthropicMcpResource,\n AnthropicMcpPrompt,\n} from '@page-mcp/protocol';\n\n// ------ Types for Vue 2 ------\n\ninterface Vue2ComponentOptions {\n beforeCreate?: () => void;\n created?: () => void;\n beforeDestroy?: () => void;\n [key: string]: unknown;\n}\n\ninterface Vue2Instance {\n $pageMcp?: PageMcpInjection;\n $options: {\n pageMcpTools?: PageMcpToolDefinition[];\n pageMcpResources?: PageMcpResourceDefinition[];\n pageMcpSkills?: SkillDefinition[];\n pageMcpPrompts?: PageMcpPromptDefinition[];\n parent?: Vue2Instance;\n [key: string]: unknown;\n };\n $root: Vue2Instance;\n __pageMcpRegistered?: {\n tools: string[];\n resources: string[];\n skills: string[];\n prompts: string[];\n };\n [key: string]: unknown;\n}\n\ninterface Vue2Constructor {\n mixin(mixin: Vue2ComponentOptions): void;\n prototype: Vue2Instance;\n [key: string]: unknown;\n}\n\ninterface PageMcpInjection {\n host: PageMcpHost;\n client: PageMcpClient;\n skills: InstanceType<typeof Extensions.SkillsClient>;\n bus: EventBus;\n hostInfo: HostInfo;\n}\n\n// ------ Plugin ------\n\nexport interface PageMcpPluginOptions {\n name: string;\n version: string;\n bus?: EventBus;\n}\n\n/**\n * Vue 2 Plugin. Install globally:\n *\n * ```js\n * import Vue from 'vue';\n * import { PageMcpPlugin } from '@page-mcp/vue2';\n *\n * Vue.use(PageMcpPlugin, { name: 'my-app', version: '1.0' });\n * ```\n *\n * After installation, `this.$pageMcp` is available in all components:\n * - `this.$pageMcp.host` — PageMcpHost instance\n * - `this.$pageMcp.client` — PageMcpClient instance\n * - `this.$pageMcp.bus` — EventBus instance\n */\nexport const PageMcpPlugin = {\n install(Vue: Vue2Constructor, options: PageMcpPluginOptions): void {\n const bus = options.bus ?? new EventBus();\n const host = new PageMcpHost({ name: options.name, version: options.version, bus });\n const client = new PageMcpClient({ bus });\n const skills = Extensions.createSkillsClient(client);\n const hostInfo: HostInfo = { name: options.name, version: options.version };\n\n host.start();\n client.connect();\n\n const injection: PageMcpInjection = { host, client, skills, bus, hostInfo };\n\n // Make $pageMcp available in all components\n Vue.prototype.$pageMcp = injection;\n\n // Install the auto-registration mixin\n Vue.mixin(pageMcpAutoRegisterMixin);\n },\n};\n\n// ------ Mixin ------\n\n/**\n * Mixin that auto-registers tools/resources/skills defined in component options.\n *\n * ```js\n * export default {\n * pageMcpTools: [\n * {\n * name: 'search',\n * description: 'Search products',\n * parameters: { type: 'object', properties: { q: { type: 'string' } } },\n * handler: async (args) => this.searchProducts(args.q),\n * }\n * ],\n * pageMcpResources: [...],\n * pageMcpSkills: [...],\n * }\n * ```\n */\nconst pageMcpAutoRegisterMixin: Vue2ComponentOptions = {\n created(this: Vue2Instance) {\n const pageMcp = this.$pageMcp;\n if (!pageMcp) return;\n\n const { host } = pageMcp;\n this.__pageMcpRegistered = {\n tools: [],\n resources: [],\n skills: [],\n prompts: [],\n };\n\n // Register tools from component options\n const tools = this.$options.pageMcpTools;\n if (tools && Array.isArray(tools)) {\n for (const tool of tools) {\n try {\n host.registerTool(tool);\n this.__pageMcpRegistered.tools.push(tool.name);\n } catch {\n // Already registered\n }\n }\n }\n\n // Register resources from component options\n const resources = this.$options.pageMcpResources;\n if (resources && Array.isArray(resources)) {\n for (const resource of resources) {\n try {\n host.registerResource(resource);\n this.__pageMcpRegistered.resources.push(resource.uri);\n } catch {\n // Already registered\n }\n }\n }\n\n // Register skills from component options\n const skills = this.$options.pageMcpSkills;\n if (skills && Array.isArray(skills)) {\n for (const skill of skills) {\n try {\n host.registerSkill(skill);\n this.__pageMcpRegistered.skills.push(skill.name);\n } catch {\n // Already registered\n }\n }\n }\n\n // Register prompts from component options\n const prompts = this.$options.pageMcpPrompts;\n if (prompts && Array.isArray(prompts)) {\n for (const prompt of prompts) {\n try {\n host.registerPrompt(prompt);\n this.__pageMcpRegistered.prompts.push(prompt.name);\n } catch {\n // Already registered\n }\n }\n }\n },\n beforeDestroy(this: Vue2Instance) {\n const pageMcp = this.$pageMcp;\n const registered = this.__pageMcpRegistered;\n if (!pageMcp || !registered) return;\n const { host } = pageMcp;\n\n for (const name of registered.tools) {\n try { host.unregisterTool(name); } catch { /* noop */ }\n }\n for (const uri of registered.resources) {\n try { host.unregisterResource(uri); } catch { /* noop */ }\n }\n for (const name of registered.skills) {\n try { host.unregisterSkill(name); } catch { /* noop */ }\n }\n for (const name of registered.prompts) {\n try { host.unregisterPrompt(name); } catch { /* noop */ }\n }\n },\n};\n\n/**\n * Standalone mixin for manual use (without the plugin).\n * Useful when you want to use the mixin pattern explicitly.\n */\nexport { pageMcpAutoRegisterMixin as pageMcpMixin };\n\n// ------ Re-exports ------\n\nexport {\n Extensions,\n PageMcpHost,\n PageMcpClient,\n EventBus,\n} from '@page-mcp/core';\n\nexport type {\n SkillDefinition,\n SkillInfo,\n SkillGetResult,\n SkillExecutionResult,\n SkillExecutionContext,\n HostInfo,\n} from '@page-mcp/core';\nexport type {\n PageMcpToolDefinition,\n PageMcpResourceDefinition,\n PageMcpPromptDefinition,\n AnthropicMcpTool,\n AnthropicMcpResource,\n AnthropicMcpPrompt,\n} from '@page-mcp/protocol';\n"],"mappings":"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","names":["Extensions","PageMcpHost","PageMcpClient","EventBus"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@page-mcp/vue2",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "Vue 2 adapter for Page MCP SDK — Plugin + Mixin",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -28,13 +28,16 @@
|
|
|
28
28
|
],
|
|
29
29
|
"peerDependencies": {
|
|
30
30
|
"vue": ">=2.6.0 <3.0.0",
|
|
31
|
-
"@page-mcp/core": "^
|
|
31
|
+
"@page-mcp/core": "^3.1.0"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@page-mcp/protocol": "^3.1.0"
|
|
32
35
|
},
|
|
33
36
|
"devDependencies": {
|
|
34
37
|
"vue": "^2.7.0",
|
|
38
|
+
"@page-mcp/core": "^3.1.0",
|
|
35
39
|
"tsup": "^8.0.0",
|
|
36
|
-
"typescript": "^5.4.0"
|
|
37
|
-
"@page-mcp/core": "^2.0.0"
|
|
40
|
+
"typescript": "^5.4.0"
|
|
38
41
|
},
|
|
39
42
|
"scripts": {
|
|
40
43
|
"build": "tsup",
|