huly-mcp-selfhost 1.0.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/.env.example +16 -0
- package/README.md +522 -0
- package/dist/connection.d.ts +9 -0
- package/dist/connection.js +122 -0
- package/dist/connection.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas.d.ts +459 -0
- package/dist/schemas.js +196 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +87 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/attachments.d.ts +28 -0
- package/dist/tools/attachments.js +61 -0
- package/dist/tools/attachments.js.map +1 -0
- package/dist/tools/channels.d.ts +44 -0
- package/dist/tools/channels.js +130 -0
- package/dist/tools/channels.js.map +1 -0
- package/dist/tools/comments.d.ts +27 -0
- package/dist/tools/comments.js +60 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/components.d.ts +19 -0
- package/dist/tools/components.js +57 -0
- package/dist/tools/components.js.map +1 -0
- package/dist/tools/documents.d.ts +68 -0
- package/dist/tools/documents.js +207 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/issues.d.ts +56 -0
- package/dist/tools/issues.js +262 -0
- package/dist/tools/issues.js.map +1 -0
- package/dist/tools/labels.d.ts +35 -0
- package/dist/tools/labels.js +150 -0
- package/dist/tools/labels.js.map +1 -0
- package/dist/tools/log-time.d.ts +10 -0
- package/dist/tools/log-time.js +31 -0
- package/dist/tools/log-time.js.map +1 -0
- package/dist/tools/members.d.ts +6 -0
- package/dist/tools/members.js +17 -0
- package/dist/tools/members.js.map +1 -0
- package/dist/tools/milestones.d.ts +19 -0
- package/dist/tools/milestones.js +80 -0
- package/dist/tools/milestones.js.map +1 -0
- package/dist/tools/organizations.d.ts +32 -0
- package/dist/tools/organizations.js +86 -0
- package/dist/tools/organizations.js.map +1 -0
- package/dist/tools/projects.d.ts +24 -0
- package/dist/tools/projects.js +64 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/relations.d.ts +27 -0
- package/dist/tools/relations.js +103 -0
- package/dist/tools/relations.js.map +1 -0
- package/dist/tools/search.d.ts +9 -0
- package/dist/tools/search.js +32 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/statuses.d.ts +16 -0
- package/dist/tools/statuses.js +93 -0
- package/dist/tools/statuses.js.map +1 -0
- package/dist/utils/errors.d.ts +11 -0
- package/dist/utils/errors.js +24 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/format.d.ts +4 -0
- package/dist/utils/format.js +28 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/markdown.d.ts +14 -0
- package/dist/utils/markdown.js +144 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/storage.d.ts +7 -0
- package/dist/utils/storage.js +82 -0
- package/dist/utils/storage.js.map +1 -0
- package/package.json +68 -0
- package/scripts/cleanup-issues.js +132 -0
- package/scripts/demo.js +193 -0
- package/scripts/import-csv.js +242 -0
- package/scripts/sample-tasks.csv +11 -0
- package/scripts/setup.js +103 -0
package/scripts/setup.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* One-time setup: authenticate via OTP and save your token to .env
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* node scripts/setup.js
|
|
7
|
+
*
|
|
8
|
+
* What it does:
|
|
9
|
+
* 1. Sends a one-time code to your email
|
|
10
|
+
* 2. You paste the code
|
|
11
|
+
* 3. Saves HULY_TOKEN + HULY_WORKSPACE to .env
|
|
12
|
+
*
|
|
13
|
+
* After setup, the MCP server and import script work without any manual token steps.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
'use strict'
|
|
17
|
+
|
|
18
|
+
const fs = require('fs')
|
|
19
|
+
const path = require('path')
|
|
20
|
+
const readline = require('readline')
|
|
21
|
+
|
|
22
|
+
const { getClient } = require('@hcengineering/account-client')
|
|
23
|
+
|
|
24
|
+
const envFile = path.join(__dirname, '..', '.env')
|
|
25
|
+
const accountsUrl = process.env.HULY_ACCOUNTS_URL ?? 'https://account.huly.app'
|
|
26
|
+
|
|
27
|
+
function ask (question) {
|
|
28
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout })
|
|
29
|
+
return new Promise(resolve => rl.question(question, ans => { rl.close(); resolve(ans.trim()) }))
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function writeEnv (token, workspace, accountsUrl) {
|
|
33
|
+
const lines = [
|
|
34
|
+
`HULY_WORKSPACE=${workspace}`,
|
|
35
|
+
`HULY_TOKEN=${token}`,
|
|
36
|
+
accountsUrl !== 'https://account.huly.app' ? `HULY_ACCOUNTS_URL=${accountsUrl}` : null
|
|
37
|
+
].filter(Boolean)
|
|
38
|
+
|
|
39
|
+
// Merge with existing .env (don't overwrite unrelated vars)
|
|
40
|
+
let existing = ''
|
|
41
|
+
if (fs.existsSync(envFile)) {
|
|
42
|
+
existing = fs.readFileSync(envFile, 'utf8')
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const keep = existing.split('\n').filter(line => {
|
|
46
|
+
const key = line.split('=')[0]
|
|
47
|
+
return !['HULY_TOKEN', 'HULY_WORKSPACE', 'HULY_EMAIL', 'HULY_PASSWORD', 'HULY_ACCOUNTS_URL'].includes(key)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
fs.writeFileSync(envFile, [...keep.filter(Boolean), ...lines].join('\n') + '\n')
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function main () {
|
|
54
|
+
console.log('\nš§ Huly MCP Setup\n')
|
|
55
|
+
|
|
56
|
+
const email = await ask(' Email address (the one you use for huly.app): ')
|
|
57
|
+
if (!email.includes('@')) { console.error('Invalid email.'); process.exit(1) }
|
|
58
|
+
|
|
59
|
+
const workspace = await ask(' Workspace slug (e.g. "medics" from huly.app/medics): ')
|
|
60
|
+
if (!workspace) { console.error('Workspace is required.'); process.exit(1) }
|
|
61
|
+
|
|
62
|
+
console.log(`\n Sending OTP to ${email}...`)
|
|
63
|
+
const unauthClient = getClient(accountsUrl)
|
|
64
|
+
await unauthClient.loginOtp(email)
|
|
65
|
+
console.log(' ā
Code sent!\n')
|
|
66
|
+
|
|
67
|
+
const code = await ask(' Enter the 6-digit code from your email: ')
|
|
68
|
+
|
|
69
|
+
console.log('\n Validating...')
|
|
70
|
+
const loginInfo = await unauthClient.validateOtp(email, code.trim())
|
|
71
|
+
|
|
72
|
+
if (!loginInfo?.token) {
|
|
73
|
+
console.error(' ā Invalid or expired code. Run setup again.')
|
|
74
|
+
process.exit(1)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Verify workspace is accessible
|
|
78
|
+
const authedClient = getClient(accountsUrl, loginInfo.token)
|
|
79
|
+
const wsInfo = await authedClient.selectWorkspace(workspace, 'external').catch(e => {
|
|
80
|
+
console.error(` ā Could not access workspace '${workspace}': ${e.message}`)
|
|
81
|
+
process.exit(1)
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
if (!wsInfo?.endpoint) {
|
|
85
|
+
console.error(` ā Workspace '${workspace}' not found or not accessible.`)
|
|
86
|
+
process.exit(1)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Save token to .env
|
|
90
|
+
writeEnv(loginInfo.token, workspace, accountsUrl)
|
|
91
|
+
|
|
92
|
+
console.log(`\n ā
Setup complete!`)
|
|
93
|
+
console.log(` Workspace : ${workspace}`)
|
|
94
|
+
console.log(` Endpoint : ${wsInfo.endpoint}`)
|
|
95
|
+
console.log(` Token saved to .env\n`)
|
|
96
|
+
console.log(' You can now run:')
|
|
97
|
+
console.log(' node scripts/import-csv.js your-tasks.csv PROJ\n')
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
main().catch(err => {
|
|
101
|
+
console.error('\nā Setup failed:', err.message)
|
|
102
|
+
process.exit(1)
|
|
103
|
+
})
|