vlossom-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 +85 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +19 -0
- package/dist/server.js.map +1 -0
- package/dist/services/component-registry.d.ts +7 -0
- package/dist/services/component-registry.d.ts.map +1 -0
- package/dist/services/component-registry.js +41 -0
- package/dist/services/component-registry.js.map +1 -0
- package/dist/services/github-client.d.ts +8 -0
- package/dist/services/github-client.d.ts.map +1 -0
- package/dist/services/github-client.js +28 -0
- package/dist/services/github-client.js.map +1 -0
- package/dist/tools/check-github-token.d.ts +3 -0
- package/dist/tools/check-github-token.d.ts.map +1 -0
- package/dist/tools/check-github-token.js +6 -0
- package/dist/tools/check-github-token.js.map +1 -0
- package/dist/tools/draft-issue.d.ts +3 -0
- package/dist/tools/draft-issue.d.ts.map +1 -0
- package/dist/tools/draft-issue.js +47 -0
- package/dist/tools/draft-issue.js.map +1 -0
- package/dist/tools/list-components.d.ts +3 -0
- package/dist/tools/list-components.d.ts.map +1 -0
- package/dist/tools/list-components.js +6 -0
- package/dist/tools/list-components.js.map +1 -0
- package/dist/tools/report-issue.d.ts +3 -0
- package/dist/tools/report-issue.d.ts.map +1 -0
- package/dist/tools/report-issue.js +24 -0
- package/dist/tools/report-issue.js.map +1 -0
- package/dist/tools/set-github-token.d.ts +3 -0
- package/dist/tools/set-github-token.d.ts.map +1 -0
- package/dist/tools/set-github-token.js +18 -0
- package/dist/tools/set-github-token.js.map +1 -0
- package/dist/utils/mcp-response.d.ts +7 -0
- package/dist/utils/mcp-response.d.ts.map +1 -0
- package/dist/utils/mcp-response.js +6 -0
- package/dist/utils/mcp-response.js.map +1 -0
- package/dist/utils/path-resolver.d.ts +2 -0
- package/dist/utils/path-resolver.d.ts.map +1 -0
- package/dist/utils/path-resolver.js +22 -0
- package/dist/utils/path-resolver.js.map +1 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# vlossom-mcp
|
|
2
|
+
|
|
3
|
+
Vlossom UI 컴포넌트 라이브러리를 AI 어시스턴트(Claude 등)가 정확하게 참조할 수 있도록 하는 MCP(Model Context Protocol) 서버입니다.
|
|
4
|
+
|
|
5
|
+
## 사전 요구사항
|
|
6
|
+
|
|
7
|
+
| 도구 | 버전 |
|
|
8
|
+
| ----------- | -------- |
|
|
9
|
+
| Node.js | 18.0 이상 |
|
|
10
|
+
|
|
11
|
+
## 기술 스택
|
|
12
|
+
|
|
13
|
+
- Node.js / TypeScript
|
|
14
|
+
- [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/typescript-sdk) — MCP SDK
|
|
15
|
+
- stdio transport (인증 없음)
|
|
16
|
+
|
|
17
|
+
## 제공 도구
|
|
18
|
+
|
|
19
|
+
| 도구 | 설명 |
|
|
20
|
+
| --------------------- | ---------------------------------------------- |
|
|
21
|
+
| `list_components` | Vlossom 컴포넌트 전체 목록과 설명 반환 |
|
|
22
|
+
| `check_github_token` | GitHub 토큰 설정 여부 확인 |
|
|
23
|
+
| `draft_issue` | bug / enhancement / question 이슈 초안 생성 |
|
|
24
|
+
| `report_issue` | vlossom-ui/vlossom 레포에 GitHub 이슈 등록 |
|
|
25
|
+
|
|
26
|
+
## AI 어시스턴트 연결
|
|
27
|
+
|
|
28
|
+
### Claude Code / Claude Desktop
|
|
29
|
+
|
|
30
|
+
`claude.json` (또는 `claude_desktop_config.json`):
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"mcpServers": {
|
|
35
|
+
"vlossom": {
|
|
36
|
+
"command": "npx",
|
|
37
|
+
"args": ["-y", "@vlossom/mcp"],
|
|
38
|
+
"env": {
|
|
39
|
+
"VLOSSOM_GITHUB_TOKEN": "ghp_your_token_here"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 로컬 개발 빌드로 연결 (모노레포 내부)
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"mcpServers": {
|
|
51
|
+
"vlossom": {
|
|
52
|
+
"command": "node",
|
|
53
|
+
"args": ["packages/vlossom-mcp/dist/index.js"]
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## 환경변수
|
|
60
|
+
|
|
61
|
+
| 변수 | 필수 | 설명 |
|
|
62
|
+
| --------------------------- | ---- | ------------------------------------------------------- |
|
|
63
|
+
| `VLOSSOM_GITHUB_TOKEN` | 선택 | GitHub PAT (issues:write 권한). `report_issue` 사용 시 필요 |
|
|
64
|
+
| `VLOSSOM_COMPONENTS_PATH` | 선택 | 컴포넌트 디렉토리 절대경로. 미설정 시 모노레포 내 자동 탐색 |
|
|
65
|
+
|
|
66
|
+
## 개발
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
cd packages/vlossom-mcp
|
|
70
|
+
|
|
71
|
+
# 의존성 설치
|
|
72
|
+
npm install
|
|
73
|
+
|
|
74
|
+
# 빌드
|
|
75
|
+
npm run build
|
|
76
|
+
|
|
77
|
+
# 빌드 후 직접 실행
|
|
78
|
+
node dist/index.js
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## 상세 계획
|
|
82
|
+
|
|
83
|
+
- [개요 및 설계 결정](../docs/plans/vlossom-mcp/OVERVIEW.md)
|
|
84
|
+
- [기술 스펙](../docs/plans/vlossom-mcp/specs/2026-03-23-design.md)
|
|
85
|
+
- [구현 계획](../docs/plans/vlossom-mcp/2026-03-23-implementation-plan.md)
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
#!/usr/bin/env node
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { createServer } from "./server.js";
|
|
5
|
+
async function main() {
|
|
6
|
+
const server = createServer();
|
|
7
|
+
const transport = new StdioServerTransport();
|
|
8
|
+
await server.connect(transport);
|
|
9
|
+
}
|
|
10
|
+
main().catch((error) => {
|
|
11
|
+
process.stderr.write(`Server failed to start: ${String(error)}\n`);
|
|
12
|
+
process.exit(1);
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACf,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACpC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE,wBAAgB,YAAY,IAAI,SAAS,CAUxC"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createRequire } from "module";
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { registerListComponents } from "./tools/list-components.js";
|
|
4
|
+
import { registerCheckGitHubToken } from "./tools/check-github-token.js";
|
|
5
|
+
import { registerSetGitHubToken } from "./tools/set-github-token.js";
|
|
6
|
+
import { registerDraftIssue } from "./tools/draft-issue.js";
|
|
7
|
+
import { registerReportIssue } from "./tools/report-issue.js";
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
9
|
+
const { version } = require("../package.json");
|
|
10
|
+
export function createServer() {
|
|
11
|
+
const server = new McpServer({ name: "vlossom-mcp", version });
|
|
12
|
+
registerListComponents(server);
|
|
13
|
+
registerCheckGitHubToken(server);
|
|
14
|
+
registerSetGitHubToken(server);
|
|
15
|
+
registerDraftIssue(server);
|
|
16
|
+
registerReportIssue(server);
|
|
17
|
+
return server;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,MAAM,UAAU,YAAY;IACxB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;IAE/D,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE5B,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-registry.d.ts","sourceRoot":"","sources":["../../src/services/component-registry.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACvB;AAID,wBAAgB,aAAa,IAAI,aAAa,EAAE,CAwB/C"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { readdirSync, readFileSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { resolveComponentsPath } from "../utils/path-resolver.js";
|
|
4
|
+
let cache = null;
|
|
5
|
+
export function getComponents() {
|
|
6
|
+
if (cache)
|
|
7
|
+
return cache;
|
|
8
|
+
const componentsPath = resolveComponentsPath();
|
|
9
|
+
if (!componentsPath) {
|
|
10
|
+
process.stderr.write("Warning: Components directory not found. Set VLOSSOM_COMPONENTS_PATH environment variable.\n");
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
cache = readdirSync(componentsPath, { withFileTypes: true })
|
|
14
|
+
.filter((entry) => entry.isDirectory() && entry.name.startsWith("vs-"))
|
|
15
|
+
.map((entry) => {
|
|
16
|
+
const kebabName = entry.name;
|
|
17
|
+
return {
|
|
18
|
+
name: kebabToPascalCase(kebabName),
|
|
19
|
+
kebabName,
|
|
20
|
+
description: readDescription(join(componentsPath, kebabName)),
|
|
21
|
+
};
|
|
22
|
+
})
|
|
23
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
24
|
+
return cache;
|
|
25
|
+
}
|
|
26
|
+
function kebabToPascalCase(kebab) {
|
|
27
|
+
return kebab
|
|
28
|
+
.split("-")
|
|
29
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
30
|
+
.join("");
|
|
31
|
+
}
|
|
32
|
+
function readDescription(componentDir) {
|
|
33
|
+
const readmePath = join(componentDir, "README.md");
|
|
34
|
+
if (!existsSync(readmePath))
|
|
35
|
+
return "";
|
|
36
|
+
const lines = readFileSync(readmePath, "utf-8").split("\n");
|
|
37
|
+
return (lines
|
|
38
|
+
.map((l) => l.trim())
|
|
39
|
+
.find((l) => l.length > 0 && !l.startsWith(">") && !l.startsWith("#")) ?? "");
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=component-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-registry.js","sourceRoot":"","sources":["../../src/services/component-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAQlE,IAAI,KAAK,GAA2B,IAAI,CAAC;AAEzC,MAAM,UAAU,aAAa;IACzB,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAExB,MAAM,cAAc,GAAG,qBAAqB,EAAE,CAAC;IAC/C,IAAI,CAAC,cAAc,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,8FAA8F,CACjG,CAAC;QACF,OAAO,EAAE,CAAC;IACd,CAAC;IAED,KAAK,GAAG,WAAW,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SACvD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;SACtE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACX,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;QAC7B,OAAO;YACH,IAAI,EAAE,iBAAiB,CAAC,SAAS,CAAC;YAClC,SAAS;YACT,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;SAChE,CAAC;IACN,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAElD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACpC,OAAO,KAAK;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,YAAoB;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,CACH,KAAK;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CACnF,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface CreateIssueResult {
|
|
2
|
+
issueUrl: string;
|
|
3
|
+
issueNumber: number;
|
|
4
|
+
}
|
|
5
|
+
export declare function setGitHubToken(token: string): void;
|
|
6
|
+
export declare function getGitHubToken(): string | undefined;
|
|
7
|
+
export declare function createIssue(token: string, title: string, body: string, labels?: string[]): Promise<CreateIssueResult>;
|
|
8
|
+
//# sourceMappingURL=github-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../../src/services/github-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACvB;AAID,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAEnD;AAED,wBAAsB,WAAW,CAC7B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAoB5B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const GITHUB_API_URL = "https://api.github.com/repos/vlossom-ui/vlossom/issues";
|
|
2
|
+
let runtimeToken;
|
|
3
|
+
export function setGitHubToken(token) {
|
|
4
|
+
runtimeToken = token;
|
|
5
|
+
}
|
|
6
|
+
export function getGitHubToken() {
|
|
7
|
+
return runtimeToken || process.env["VLOSSOM_GITHUB_TOKEN"] || undefined;
|
|
8
|
+
}
|
|
9
|
+
export async function createIssue(token, title, body, labels) {
|
|
10
|
+
const response = await fetch(GITHUB_API_URL, {
|
|
11
|
+
method: "POST",
|
|
12
|
+
headers: {
|
|
13
|
+
Authorization: `Bearer ${token}`,
|
|
14
|
+
"User-Agent": "vlossom-mcp",
|
|
15
|
+
Accept: "application/vnd.github+json",
|
|
16
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
17
|
+
"Content-Type": "application/json",
|
|
18
|
+
},
|
|
19
|
+
body: JSON.stringify({ title, body, labels: labels ?? [] }),
|
|
20
|
+
});
|
|
21
|
+
if (!response.ok) {
|
|
22
|
+
const text = await response.text();
|
|
23
|
+
throw new Error(`GitHub API error ${response.status}: ${text}`);
|
|
24
|
+
}
|
|
25
|
+
const data = (await response.json());
|
|
26
|
+
return { issueUrl: data.html_url, issueNumber: data.number };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=github-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../src/services/github-client.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,wDAAwD,CAAC;AAOhF,IAAI,YAAgC,CAAC;AAErC,MAAM,UAAU,cAAc,CAAC,KAAa;IACxC,YAAY,GAAG,KAAK,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc;IAC1B,OAAO,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,SAAS,CAAC;AAC5E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC7B,KAAa,EACb,KAAa,EACb,IAAY,EACZ,MAAiB;IAEjB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE;QACzC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACL,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,YAAY,EAAE,aAAa;YAC3B,MAAM,EAAE,6BAA6B;YACrC,sBAAsB,EAAE,YAAY;YACpC,cAAc,EAAE,kBAAkB;SACrC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC;KAC9D,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyC,CAAC;IAC7E,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-github-token.d.ts","sourceRoot":"","sources":["../../src/tools/check-github-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAOhE"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { getGitHubToken } from "../services/github-client.js";
|
|
2
|
+
import { textResponse } from "../utils/mcp-response.js";
|
|
3
|
+
export function registerCheckGitHubToken(server) {
|
|
4
|
+
server.tool("check_github_token", "Check whether a GitHub token is configured for submitting issues.", {}, () => textResponse({ isConfigured: !!getGitHubToken() }));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=check-github-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-github-token.js","sourceRoot":"","sources":["../../src/tools/check-github-token.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACP,oBAAoB,EACpB,mEAAmE,EACnE,EAAE,EACF,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAC3D,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-issue.d.ts","sourceRoot":"","sources":["../../src/tools/draft-issue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgB1D"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { textResponse } from "../utils/mcp-response.js";
|
|
3
|
+
export function registerDraftIssue(server) {
|
|
4
|
+
server.tool("draft_issue", "Generate a structured Markdown template for a GitHub issue. " +
|
|
5
|
+
"ALWAYS call this before report_issue. " +
|
|
6
|
+
"After receiving the template, go through each requiredSection with the user one by one " +
|
|
7
|
+
"to collect detailed information before submitting.", {
|
|
8
|
+
summary: z.string().describe("Brief one-line summary of the issue"),
|
|
9
|
+
type: z
|
|
10
|
+
.enum(["bug", "enhancement", "question"])
|
|
11
|
+
.default("bug")
|
|
12
|
+
.describe("Issue type"),
|
|
13
|
+
}, ({ summary, type }) => textResponse(buildDraft(summary, type)));
|
|
14
|
+
}
|
|
15
|
+
function buildDraft(summary, type) {
|
|
16
|
+
switch (type) {
|
|
17
|
+
case "enhancement":
|
|
18
|
+
return {
|
|
19
|
+
suggestedTitle: `feat: ${summary}`,
|
|
20
|
+
bodyTemplate: `## 요청 기능\n\n${summary}\n\n` +
|
|
21
|
+
`## 동기 / 사용 사례\n\n<!-- 이 기능이 왜 필요한지 설명해주세요 -->\n\n` +
|
|
22
|
+
`## 제안하는 API / 동작\n\n\`\`\`vue\n<!-- 예상 사용 예시 -->\n\`\`\`\n\n` +
|
|
23
|
+
`## 추가 컨텍스트\n\n<!-- 참고 자료, 스크린샷 등 -->`,
|
|
24
|
+
requiredSections: ["동기 / 사용 사례", "제안하는 API / 동작"],
|
|
25
|
+
};
|
|
26
|
+
case "question":
|
|
27
|
+
return {
|
|
28
|
+
suggestedTitle: `question: ${summary}`,
|
|
29
|
+
bodyTemplate: `## 질문\n\n${summary}\n\n` +
|
|
30
|
+
`## 시도한 것\n\n<!-- 이미 시도해본 것들을 적어주세요 -->\n\n` +
|
|
31
|
+
`## 관련 코드\n\n\`\`\`vue\n<!-- 관련 코드 -->\n\`\`\``,
|
|
32
|
+
requiredSections: ["시도한 것", "관련 코드"],
|
|
33
|
+
};
|
|
34
|
+
default:
|
|
35
|
+
return {
|
|
36
|
+
suggestedTitle: `fix: ${summary}`,
|
|
37
|
+
bodyTemplate: `## 버그 설명\n\n${summary}\n\n` +
|
|
38
|
+
`## 재현 방법\n\n1. \n2. \n3. \n\n` +
|
|
39
|
+
`## 예상 동작\n\n<!-- 어떻게 동작해야 하나요? -->\n\n` +
|
|
40
|
+
`## 실제 동작\n\n<!-- 실제로는 어떻게 동작하나요? -->\n\n` +
|
|
41
|
+
`## 코드 예시\n\n\`\`\`vue\n<!-- 재현 코드 -->\n\`\`\`\n\n` +
|
|
42
|
+
`## 환경\n\n- Vlossom 버전: \n- Vue 버전: \n- 브라우저: `,
|
|
43
|
+
requiredSections: ["재현 방법", "예상 동작", "실제 동작", "코드 예시"],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=draft-issue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-issue.js","sourceRoot":"","sources":["../../src/tools/draft-issue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAChD,MAAM,CAAC,IAAI,CACP,aAAa,EACb,8DAA8D;QAC1D,wCAAwC;QACxC,yFAAyF;QACzF,oDAAoD,EACxD;QACI,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QACnE,IAAI,EAAE,CAAC;aACF,IAAI,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;aACxC,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CAAC,YAAY,CAAC;KAC9B,EACD,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CACjE,CAAC;AACN,CAAC;AAED,SAAS,UAAU,CACf,OAAe,EACf,IAAwC;IAExC,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,aAAa;YACd,OAAO;gBACH,cAAc,EAAE,SAAS,OAAO,EAAE;gBAClC,YAAY,EACR,eAAe,OAAO,MAAM;oBAC5B,mDAAmD;oBACnD,8DAA8D;oBAC9D,sCAAsC;gBAC1C,gBAAgB,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC;aACpD,CAAC;QACN,KAAK,UAAU;YACX,OAAO;gBACH,cAAc,EAAE,aAAa,OAAO,EAAE;gBACtC,YAAY,EACR,YAAY,OAAO,MAAM;oBACzB,4CAA4C;oBAC5C,+CAA+C;gBACnD,gBAAgB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;aACvC,CAAC;QACN;YACI,OAAO;gBACH,cAAc,EAAE,QAAQ,OAAO,EAAE;gBACjC,YAAY,EACR,eAAe,OAAO,MAAM;oBAC5B,+BAA+B;oBAC/B,wCAAwC;oBACxC,0CAA0C;oBAC1C,mDAAmD;oBACnD,+CAA+C;gBACnD,gBAAgB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;aACzD,CAAC;IACV,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-components.d.ts","sourceRoot":"","sources":["../../src/tools/list-components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAO9D"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { getComponents } from "../services/component-registry.js";
|
|
2
|
+
import { textResponse } from "../utils/mcp-response.js";
|
|
3
|
+
export function registerListComponents(server) {
|
|
4
|
+
server.tool("list_components", "Get a list of all Vlossom UI components with their names and descriptions.", {}, () => textResponse(getComponents()));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=list-components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-components.js","sourceRoot":"","sources":["../../src/tools/list-components.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACP,iBAAiB,EACjB,4EAA4E,EAC5E,EAAE,EACF,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,CACtC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-issue.d.ts","sourceRoot":"","sources":["../../src/tools/report-issue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0B3D"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { createIssue, getGitHubToken } from "../services/github-client.js";
|
|
3
|
+
import { textResponse } from "../utils/mcp-response.js";
|
|
4
|
+
export function registerReportIssue(server) {
|
|
5
|
+
server.tool("report_issue", "Create a GitHub issue on the Vlossom repository. " +
|
|
6
|
+
"Call draft_issue first and fill in all requiredSections with the user before calling this. " +
|
|
7
|
+
"Always confirm the final content with the user before submitting. " +
|
|
8
|
+
"Requires VLOSSOM_GITHUB_TOKEN environment variable with issues:write scope.", {
|
|
9
|
+
title: z.string().describe("Issue title"),
|
|
10
|
+
body: z.string().describe("Issue body in Markdown, with all sections filled in"),
|
|
11
|
+
labels: z
|
|
12
|
+
.array(z.string())
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Optional labels such as 'bug', 'enhancement', 'question'"),
|
|
15
|
+
}, async ({ title, body, labels }) => {
|
|
16
|
+
const token = getGitHubToken();
|
|
17
|
+
if (!token) {
|
|
18
|
+
throw new Error("VLOSSOM_GITHUB_TOKEN is not configured. " +
|
|
19
|
+
"Set the environment variable with a GitHub PAT that has issues:write scope.");
|
|
20
|
+
}
|
|
21
|
+
return textResponse(await createIssue(token, title, body, labels));
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=report-issue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-issue.js","sourceRoot":"","sources":["../../src/tools/report-issue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACjD,MAAM,CAAC,IAAI,CACP,cAAc,EACd,mDAAmD;QAC/C,6FAA6F;QAC7F,oEAAoE;QACpE,6EAA6E,EACjF;QACI,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;QAChF,MAAM,EAAE,CAAC;aACJ,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,QAAQ,EAAE;aACV,QAAQ,CAAC,0DAA0D,CAAC;KAC5E,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACX,0CAA0C;gBACtC,6EAA6E,CACpF,CAAC;QACN,CAAC;QACD,OAAO,YAAY,CAAC,MAAM,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACvE,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-github-token.d.ts","sourceRoot":"","sources":["../../src/tools/set-github-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkB9D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { setGitHubToken } from "../services/github-client.js";
|
|
3
|
+
import { textResponse } from "../utils/mcp-response.js";
|
|
4
|
+
export function registerSetGitHubToken(server) {
|
|
5
|
+
server.tool("set_github_token", "Store a GitHub Personal Access Token (PAT) for this session so that report_issue can submit issues. " +
|
|
6
|
+
"Call this when check_github_token returns isConfigured: false. " +
|
|
7
|
+
"Ask the user to provide a PAT with issues:write scope, then pass it here. " +
|
|
8
|
+
"The token is kept in memory only and is not persisted to disk.", {
|
|
9
|
+
token: z
|
|
10
|
+
.string()
|
|
11
|
+
.min(1)
|
|
12
|
+
.describe("GitHub Personal Access Token with issues:write scope (e.g. ghp_xxxx or github_pat_xxxx)"),
|
|
13
|
+
}, ({ token }) => {
|
|
14
|
+
setGitHubToken(token);
|
|
15
|
+
return textResponse({ success: true, message: "GitHub token has been set for this session." });
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=set-github-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-github-token.js","sourceRoot":"","sources":["../../src/tools/set-github-token.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACP,kBAAkB,EAClB,sGAAsG;QAClG,iEAAiE;QACjE,4EAA4E;QAC5E,gEAAgE,EACpE;QACI,KAAK,EAAE,CAAC;aACH,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CAAC,yFAAyF,CAAC;KAC3G,EACD,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACV,cAAc,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,6CAA6C,EAAE,CAAC,CAAC;IACnG,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-response.d.ts","sourceRoot":"","sources":["../../src/utils/mcp-response.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO;;;;;EAIzC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-response.js","sourceRoot":"","sources":["../../src/utils/mcp-response.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,IAAa;IACtC,OAAO;QACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;KACnE,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/path-resolver.ts"],"names":[],"mappings":"AAMA,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAmBrD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { existsSync } from "fs";
|
|
2
|
+
import { resolve, dirname } from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
export function resolveComponentsPath() {
|
|
6
|
+
const envPath = process.env["VLOSSOM_COMPONENTS_PATH"];
|
|
7
|
+
if (envPath) {
|
|
8
|
+
return resolve(envPath);
|
|
9
|
+
}
|
|
10
|
+
// 모노레포 내 개발 환경: packages/vlossom-mcp/dist/utils/ -> packages/vlossom/src/components
|
|
11
|
+
const monorepoPaths = [
|
|
12
|
+
resolve(__dirname, "../../../vlossom/src/components"),
|
|
13
|
+
resolve(__dirname, "../../../../packages/vlossom/src/components"),
|
|
14
|
+
];
|
|
15
|
+
for (const candidate of monorepoPaths) {
|
|
16
|
+
if (existsSync(candidate)) {
|
|
17
|
+
return candidate;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=path-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-resolver.js","sourceRoot":"","sources":["../../src/utils/path-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,UAAU,qBAAqB;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvD,IAAI,OAAO,EAAE,CAAC;QACV,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,oFAAoF;IACpF,MAAM,aAAa,GAAG;QAClB,OAAO,CAAC,SAAS,EAAE,iCAAiC,CAAC;QACrD,OAAO,CAAC,SAAS,EAAE,6CAA6C,CAAC;KACpE,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;QACpC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "vlossom-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for Vlossom UI component library",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"vlossom-mcp": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc && node -e \"const fs=require('fs');const f='dist/index.js';fs.writeFileSync(f,'#!/usr/bin/env node\\n'+fs.readFileSync(f,'utf8'));\"",
|
|
12
|
+
"dev": "tsc --watch",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"prepublishOnly": "npm run build"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
21
|
+
"zod": "^3.24.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^22.0.0",
|
|
25
|
+
"typescript": "~5.8.3"
|
|
26
|
+
},
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=18.0.0"
|
|
29
|
+
},
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "git+https://github.com/vlossom-ui/vlossom.git",
|
|
33
|
+
"directory": "packages/vlossom-mcp"
|
|
34
|
+
},
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"keywords": [
|
|
37
|
+
"mcp",
|
|
38
|
+
"vlossom",
|
|
39
|
+
"vue",
|
|
40
|
+
"ui-components",
|
|
41
|
+
"claude"
|
|
42
|
+
]
|
|
43
|
+
}
|