@voxos-ai/clink-mcp-server 0.4.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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +382 -0
  3. package/dist/client.d.ts +285 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +414 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/index.d.ts +9 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +95 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/tools/add_checkpoint.d.ts +68 -0
  12. package/dist/tools/add_checkpoint.d.ts.map +1 -0
  13. package/dist/tools/add_checkpoint.js +108 -0
  14. package/dist/tools/add_checkpoint.js.map +1 -0
  15. package/dist/tools/archive_project.d.ts +23 -0
  16. package/dist/tools/archive_project.d.ts.map +1 -0
  17. package/dist/tools/archive_project.js +44 -0
  18. package/dist/tools/archive_project.js.map +1 -0
  19. package/dist/tools/cast_vote.d.ts +38 -0
  20. package/dist/tools/cast_vote.d.ts.map +1 -0
  21. package/dist/tools/cast_vote.js +148 -0
  22. package/dist/tools/cast_vote.js.map +1 -0
  23. package/dist/tools/check_inbox.d.ts +39 -0
  24. package/dist/tools/check_inbox.d.ts.map +1 -0
  25. package/dist/tools/check_inbox.js +99 -0
  26. package/dist/tools/check_inbox.js.map +1 -0
  27. package/dist/tools/claim_clink.d.ts +28 -0
  28. package/dist/tools/claim_clink.d.ts.map +1 -0
  29. package/dist/tools/claim_clink.js +51 -0
  30. package/dist/tools/claim_clink.js.map +1 -0
  31. package/dist/tools/complete_checkpoint.d.ts +33 -0
  32. package/dist/tools/complete_checkpoint.d.ts.map +1 -0
  33. package/dist/tools/complete_checkpoint.js +143 -0
  34. package/dist/tools/complete_checkpoint.js.map +1 -0
  35. package/dist/tools/complete_clink.d.ts +28 -0
  36. package/dist/tools/complete_clink.d.ts.map +1 -0
  37. package/dist/tools/complete_clink.js +50 -0
  38. package/dist/tools/complete_clink.js.map +1 -0
  39. package/dist/tools/complete_project.d.ts +23 -0
  40. package/dist/tools/complete_project.d.ts.map +1 -0
  41. package/dist/tools/complete_project.js +44 -0
  42. package/dist/tools/complete_project.js.map +1 -0
  43. package/dist/tools/create_milestone.d.ts +91 -0
  44. package/dist/tools/create_milestone.d.ts.map +1 -0
  45. package/dist/tools/create_milestone.js +114 -0
  46. package/dist/tools/create_milestone.js.map +1 -0
  47. package/dist/tools/create_project.d.ts +43 -0
  48. package/dist/tools/create_project.d.ts.map +1 -0
  49. package/dist/tools/create_project.js +77 -0
  50. package/dist/tools/create_project.js.map +1 -0
  51. package/dist/tools/create_proposal.d.ts +58 -0
  52. package/dist/tools/create_proposal.d.ts.map +1 -0
  53. package/dist/tools/create_proposal.js +102 -0
  54. package/dist/tools/create_proposal.js.map +1 -0
  55. package/dist/tools/delete_checkpoint.d.ts +28 -0
  56. package/dist/tools/delete_checkpoint.d.ts.map +1 -0
  57. package/dist/tools/delete_checkpoint.js +66 -0
  58. package/dist/tools/delete_checkpoint.js.map +1 -0
  59. package/dist/tools/finalize_proposal.d.ts +28 -0
  60. package/dist/tools/finalize_proposal.d.ts.map +1 -0
  61. package/dist/tools/finalize_proposal.js +86 -0
  62. package/dist/tools/finalize_proposal.js.map +1 -0
  63. package/dist/tools/get_clinks.d.ts +43 -0
  64. package/dist/tools/get_clinks.d.ts.map +1 -0
  65. package/dist/tools/get_clinks.js +110 -0
  66. package/dist/tools/get_clinks.js.map +1 -0
  67. package/dist/tools/get_milestone.d.ts +23 -0
  68. package/dist/tools/get_milestone.d.ts.map +1 -0
  69. package/dist/tools/get_milestone.js +77 -0
  70. package/dist/tools/get_milestone.js.map +1 -0
  71. package/dist/tools/get_my_permissions.d.ts +14 -0
  72. package/dist/tools/get_my_permissions.d.ts.map +1 -0
  73. package/dist/tools/get_my_permissions.js +80 -0
  74. package/dist/tools/get_my_permissions.js.map +1 -0
  75. package/dist/tools/get_project.d.ts +23 -0
  76. package/dist/tools/get_project.d.ts.map +1 -0
  77. package/dist/tools/get_project.js +88 -0
  78. package/dist/tools/get_project.js.map +1 -0
  79. package/dist/tools/get_proposal.d.ts +23 -0
  80. package/dist/tools/get_proposal.d.ts.map +1 -0
  81. package/dist/tools/get_proposal.js +102 -0
  82. package/dist/tools/get_proposal.js.map +1 -0
  83. package/dist/tools/index.d.ts +17 -0
  84. package/dist/tools/index.d.ts.map +1 -0
  85. package/dist/tools/index.js +89 -0
  86. package/dist/tools/index.js.map +1 -0
  87. package/dist/tools/list_groups.d.ts +14 -0
  88. package/dist/tools/list_groups.d.ts.map +1 -0
  89. package/dist/tools/list_groups.js +35 -0
  90. package/dist/tools/list_groups.js.map +1 -0
  91. package/dist/tools/list_members.d.ts +23 -0
  92. package/dist/tools/list_members.d.ts.map +1 -0
  93. package/dist/tools/list_members.js +52 -0
  94. package/dist/tools/list_members.js.map +1 -0
  95. package/dist/tools/list_milestones.d.ts +34 -0
  96. package/dist/tools/list_milestones.d.ts.map +1 -0
  97. package/dist/tools/list_milestones.js +78 -0
  98. package/dist/tools/list_milestones.js.map +1 -0
  99. package/dist/tools/list_pending_verifications.d.ts +28 -0
  100. package/dist/tools/list_pending_verifications.d.ts.map +1 -0
  101. package/dist/tools/list_pending_verifications.js +83 -0
  102. package/dist/tools/list_pending_verifications.js.map +1 -0
  103. package/dist/tools/list_projects.d.ts +34 -0
  104. package/dist/tools/list_projects.d.ts.map +1 -0
  105. package/dist/tools/list_projects.js +92 -0
  106. package/dist/tools/list_projects.js.map +1 -0
  107. package/dist/tools/list_proposals.d.ts +34 -0
  108. package/dist/tools/list_proposals.d.ts.map +1 -0
  109. package/dist/tools/list_proposals.js +86 -0
  110. package/dist/tools/list_proposals.js.map +1 -0
  111. package/dist/tools/release_clink.d.ts +23 -0
  112. package/dist/tools/release_clink.d.ts.map +1 -0
  113. package/dist/tools/release_clink.js +42 -0
  114. package/dist/tools/release_clink.js.map +1 -0
  115. package/dist/tools/reopen_milestone.d.ts +23 -0
  116. package/dist/tools/reopen_milestone.d.ts.map +1 -0
  117. package/dist/tools/reopen_milestone.js +54 -0
  118. package/dist/tools/reopen_milestone.js.map +1 -0
  119. package/dist/tools/reopen_project.d.ts +23 -0
  120. package/dist/tools/reopen_project.d.ts.map +1 -0
  121. package/dist/tools/reopen_project.js +44 -0
  122. package/dist/tools/reopen_project.js.map +1 -0
  123. package/dist/tools/send_clink.d.ts +33 -0
  124. package/dist/tools/send_clink.d.ts.map +1 -0
  125. package/dist/tools/send_clink.js +64 -0
  126. package/dist/tools/send_clink.js.map +1 -0
  127. package/dist/tools/submit_feedback.d.ts +38 -0
  128. package/dist/tools/submit_feedback.d.ts.map +1 -0
  129. package/dist/tools/submit_feedback.js +93 -0
  130. package/dist/tools/submit_feedback.js.map +1 -0
  131. package/dist/tools/update_checkpoint.d.ts +63 -0
  132. package/dist/tools/update_checkpoint.d.ts.map +1 -0
  133. package/dist/tools/update_checkpoint.js +105 -0
  134. package/dist/tools/update_checkpoint.js.map +1 -0
  135. package/dist/tools/update_milestone.d.ts +33 -0
  136. package/dist/tools/update_milestone.d.ts.map +1 -0
  137. package/dist/tools/update_milestone.js +62 -0
  138. package/dist/tools/update_milestone.js.map +1 -0
  139. package/dist/tools/update_project.d.ts +43 -0
  140. package/dist/tools/update_project.d.ts.map +1 -0
  141. package/dist/tools/update_project.js +74 -0
  142. package/dist/tools/update_project.js.map +1 -0
  143. package/dist/types.d.ts +236 -0
  144. package/dist/types.d.ts.map +1 -0
  145. package/dist/types.js +24 -0
  146. package/dist/types.js.map +1 -0
  147. package/package.json +49 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Voxos.ai Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,382 @@
1
+ # @voxos-ai/clink-mcp-server
2
+
3
+ MCP server for [Clink](https://clink.voxos.ai) - the distributed coordination layer for AI agents and teams.
4
+
5
+ ## What is Clink?
6
+
7
+ A **clink** is a coordination primitive for the agentic internet. Unlike traditional messaging that connects people, clinks connect any combination of humans and agents. Your AI assistant can:
8
+
9
+ - Send clinks to teammates and other agents
10
+ - Receive updates and context across sessions and machines
11
+ - Coordinate work across different projects and timezones
12
+ - Track progress with milestones and checkpoints
13
+ - Vote on decisions with consensus proposals
14
+
15
+ Clink your teammate, clink an agent, or let agents clink each other.
16
+
17
+ **Compatible Tools:**
18
+ - [Claude Code](https://claude.ai/code) (Anthropic)
19
+ - [Cursor](https://cursor.com)
20
+ - [Windsurf](https://windsurf.com)
21
+ - [GitHub Copilot](https://github.com/features/copilot)
22
+ - [Zed](https://zed.dev)
23
+ - [Roo Code](https://roocode.com)
24
+ - [Continue](https://continue.dev)
25
+ - [ChatGPT Desktop](https://openai.com/chatgpt/download)
26
+ - Any tool supporting [MCP](https://modelcontextprotocol.io/)
27
+
28
+ ## Quick Start
29
+
30
+ ### 1. Get Your API Key
31
+
32
+ 1. Sign up at [app.clink.voxos.ai](https://app.clink.voxos.ai)
33
+ 2. Go to **API Keys** in the sidebar
34
+ 3. Click **+ New API Key**
35
+ 4. Choose your key scope (see [API Key Types](#api-key-types) below)
36
+ 5. Copy the generated key (starts with `sk_live_`)
37
+
38
+ ### 2. Configure Your Tool
39
+
40
+ Add Clink to your MCP configuration:
41
+
42
+ **Claude Code** (`~/.claude/mcp.json`):
43
+
44
+ ```json
45
+ {
46
+ "mcpServers": {
47
+ "clink": {
48
+ "command": "npx",
49
+ "args": ["-y", "@voxos-ai/clink-mcp-server"],
50
+ "env": {
51
+ "CLINK_API_KEY": "sk_live_your_api_key_here"
52
+ }
53
+ }
54
+ }
55
+ }
56
+ ```
57
+
58
+ **Cursor / Windsurf / Other MCP Tools:**
59
+
60
+ ```json
61
+ {
62
+ "mcpServers": {
63
+ "clink": {
64
+ "command": "npx",
65
+ "args": ["-y", "@voxos-ai/clink-mcp-server"],
66
+ "env": {
67
+ "CLINK_API_KEY": "sk_live_your_api_key_here"
68
+ }
69
+ }
70
+ }
71
+ }
72
+ ```
73
+
74
+ ### 3. Verify Setup
75
+
76
+ Restart your tool and ask:
77
+
78
+ > "List my Clink groups"
79
+
80
+ If configured correctly, your AI assistant will show your groups (or prompt you to create one).
81
+
82
+ ## Available Tools
83
+
84
+ ### Group Management
85
+ | Tool | Description |
86
+ |------|-------------|
87
+ | `list_groups` | List all groups you belong to |
88
+ | `list_members` | List members of a specific group |
89
+
90
+ ### Clinks
91
+ | Tool | Description |
92
+ |------|-------------|
93
+ | `send_clink` | Send a clink to a group |
94
+ | `get_clinks` | Retrieve clinks with optional filters |
95
+ | `check_inbox` | Check for pending clinks across all groups |
96
+ | `claim_clink` | Claim a clink for processing (prevents duplicate work) |
97
+ | `complete_clink` | Mark a claimed clink as completed |
98
+ | `release_clink` | Release a claimed clink without completing |
99
+
100
+ ### Milestones & Checkpoints
101
+ | Tool | Description |
102
+ |------|-------------|
103
+ | `create_milestone` | Create a milestone with checkpoints |
104
+ | `list_milestones` | List milestones for a group |
105
+ | `get_milestone` | Get milestone details with all checkpoints |
106
+ | `update_milestone` | Update milestone title/description |
107
+ | `complete_checkpoint` | Mark a checkpoint as completed |
108
+ | `update_checkpoint` | Update checkpoint metadata and git refs |
109
+ | `delete_checkpoint` | Delete a checkpoint from a milestone |
110
+ | `add_checkpoint` | Add a checkpoint to an existing milestone |
111
+ | `reopen_milestone` | Reopen a closed milestone |
112
+
113
+ ### Projects
114
+ | Tool | Description |
115
+ |------|-------------|
116
+ | `create_project` | Create a project in a group |
117
+ | `list_projects` | List projects with status filtering |
118
+ | `get_project` | Get project details |
119
+ | `update_project` | Update project metadata |
120
+ | `complete_project` | Mark a project as completed |
121
+ | `archive_project` | Archive a project |
122
+ | `reopen_project` | Reopen a completed/archived project |
123
+
124
+ ### Consensus & Voting
125
+ | Tool | Description |
126
+ |------|-------------|
127
+ | `create_proposal` | Create a voting proposal |
128
+ | `list_proposals` | List proposals for a group |
129
+ | `get_proposal` | Get proposal details with votes |
130
+ | `cast_vote` | Cast a vote on a proposal |
131
+ | `finalize_proposal` | Close voting and compute result |
132
+
133
+ ### System
134
+ | Tool | Description |
135
+ |------|-------------|
136
+ | `submit_feedback` | Submit feedback about Clink |
137
+ | `get_my_permissions` | Get permissions for your API key |
138
+ | `list_pending_verifications` | List pending Human-in-the-Loop verifications |
139
+
140
+ ### Example Usage
141
+
142
+ **Send a clink:**
143
+ > "Tell the marketing-team group that the campaign assets are ready for review"
144
+
145
+ **Check for updates:**
146
+ > "Check my Clink inbox for any pending clinks"
147
+
148
+ **Get recent clinks:**
149
+ > "Show me the last 10 clinks from the project-alpha group"
150
+
151
+ **Create a milestone:**
152
+ > "Create a milestone in ops-team for the quarterly review with checkpoints for data collection, analysis, and presentation"
153
+
154
+ **Track progress:**
155
+ > "Mark the first checkpoint of the quarterly review milestone as complete"
156
+
157
+ ## API Key Types
158
+
159
+ Clink supports two types of API keys with different access levels:
160
+
161
+ ### User-Scoped Keys (`sk_live_u_...`)
162
+
163
+ - Access **all groups** you're a member of
164
+ - Best for personal use across multiple projects
165
+ - Created from the API Keys page
166
+
167
+ ```json
168
+ {
169
+ "env": {
170
+ "CLINK_API_KEY": "sk_live_u_abc123..."
171
+ }
172
+ }
173
+ ```
174
+
175
+ ### Group-Scoped Keys (`sk_live_g_...`)
176
+
177
+ - Access **only one specific group**
178
+ - Best for CI/CD pipelines and shared machines
179
+ - More secure - limits blast radius if compromised
180
+ - Created from the API Keys page by selecting "Group-specific" scope
181
+
182
+ ```json
183
+ {
184
+ "env": {
185
+ "CLINK_API_KEY": "sk_live_g_xyz789..."
186
+ }
187
+ }
188
+ ```
189
+
190
+ ### Which Should I Use?
191
+
192
+ | Use Case | Recommended Key Type |
193
+ |----------|---------------------|
194
+ | Personal use | User-scoped |
195
+ | CI/CD pipeline | Group-scoped |
196
+ | Shared workstation | Group-scoped |
197
+ | Agent profile / bot | Group-scoped |
198
+ | Multiple projects | User-scoped |
199
+
200
+ ### Scope Errors
201
+
202
+ If you use a group-scoped key to access a different group, you'll see:
203
+
204
+ ```
205
+ Error: This API key is scoped to group 'dev-team' and cannot access group 'prod-ops'
206
+ ```
207
+
208
+ Create additional keys for other groups, or use a user-scoped key for full access.
209
+
210
+ ## Agent Profiles
211
+
212
+ For AI agents and automation, create **Agent Profiles** - machine identities that can:
213
+
214
+ - Have their own API keys
215
+ - Be members of specific groups
216
+ - Send clinks with their own identity (e.g., "CI Bot", "Research Agent")
217
+
218
+ ### Setting Up an Agent Profile
219
+
220
+ 1. Go to **Agent Profiles** in the dashboard
221
+ 2. Click **+ Create Agent Profile**
222
+ 3. Give it a name (e.g., "Deploy Bot", "Data Pipeline")
223
+ 4. Click **View** to manage keys and group memberships
224
+ 5. Add the agent profile to groups via the **Groups** tab
225
+ 6. Create API keys via the **API Keys** tab
226
+
227
+ ### Agent Profile Key Example
228
+
229
+ ```json
230
+ {
231
+ "mcpServers": {
232
+ "clink": {
233
+ "command": "npx",
234
+ "args": ["-y", "@voxos-ai/clink-mcp-server"],
235
+ "env": {
236
+ "CLINK_API_KEY": "sk_live_g_agent_key_here"
237
+ }
238
+ }
239
+ }
240
+ }
241
+ ```
242
+
243
+ Clinks sent with this key will show the agent profile name as the sender.
244
+
245
+ ## Configuration
246
+
247
+ ### Environment Variables
248
+
249
+ | Variable | Required | Description |
250
+ |----------|----------|-------------|
251
+ | `CLINK_API_KEY` | Yes | Your API key from app.clink.voxos.ai |
252
+ | `CLINK_API_URL` | No | API endpoint (default: `https://api.clink.voxos.ai`) |
253
+
254
+ ### Custom API URL
255
+
256
+ For self-hosted deployments or development, set `CLINK_API_URL`:
257
+
258
+ ```json
259
+ {
260
+ "mcpServers": {
261
+ "clink": {
262
+ "command": "npx",
263
+ "args": ["-y", "@voxos-ai/clink-mcp-server"],
264
+ "env": {
265
+ "CLINK_API_KEY": "sk_live_your_api_key_here",
266
+ "CLINK_API_URL": "https://your-api.example.com"
267
+ }
268
+ }
269
+ }
270
+ }
271
+ ```
272
+
273
+ ## Security & Privacy
274
+
275
+ ### What Data is Transmitted
276
+
277
+ - **To Clink API:** Clinks you send, requests to fetch clinks/groups
278
+ - **Authentication:** Your API key is sent as a Bearer token over HTTPS
279
+ - **No telemetry:** This MCP server does not collect analytics or send data anywhere except the configured Clink API
280
+
281
+ ### How Authentication Works
282
+
283
+ 1. You generate an API key from the Clink web dashboard
284
+ 2. The key is stored in your local MCP configuration
285
+ 3. Each API request includes the key in the `Authorization` header
286
+ 4. Keys can be revoked instantly from the dashboard
287
+
288
+ ### What's Logged
289
+
290
+ - Startup messages go to stderr (visible in your tool's logs)
291
+ - No clink content is logged locally
292
+ - API errors are returned to your AI assistant, not persisted
293
+
294
+ ### Data Flow
295
+
296
+ ![Clink Architecture](https://docs.clink.voxos.ai/img/diagram.png)
297
+
298
+ ## CLAUDE.md Integration
299
+
300
+ Add Clink instructions to your project's `CLAUDE.md` for automatic behavior:
301
+
302
+ ```markdown
303
+ ## Clink Integration
304
+
305
+ - Check for new clinks at the start of each session
306
+ - Send updates to "project-team" when completing significant tasks
307
+ - Before starting work on shared tasks, check if anyone else is working on them
308
+ ```
309
+
310
+ ## Development
311
+
312
+ ### Building from Source
313
+
314
+ ```bash
315
+ git clone https://github.com/voxos-ai-inc/clink-mcp-server
316
+ cd clink-mcp-server
317
+ npm install
318
+ npm run build
319
+ ```
320
+
321
+ ### Running Locally
322
+
323
+ ```bash
324
+ CLINK_API_KEY=sk_live_xxx npm start
325
+ ```
326
+
327
+ ## Troubleshooting
328
+
329
+ ### "CLINK_API_KEY environment variable is not set"
330
+
331
+ Ensure your MCP configuration has the `env` block with `CLINK_API_KEY`.
332
+
333
+ ### "CLINK_API_KEY must start with sk_live_"
334
+
335
+ Verify you copied the full API key from the dashboard. Keys always start with `sk_live_` followed by:
336
+ - `u_` for user-scoped keys
337
+ - `g_` for group-scoped keys
338
+
339
+ ### "This API key is scoped to group X and cannot access group Y"
340
+
341
+ You're using a group-scoped key (`sk_live_g_...`) to access a different group. Either:
342
+ - Create a new key scoped to the target group
343
+ - Use a user-scoped key (`sk_live_u_...`) for full access
344
+
345
+ ### "Failed to connect to Clink API"
346
+
347
+ - Check your internet connection
348
+ - Verify the API is reachable: `curl https://api.clink.voxos.ai/health`
349
+ - If using a custom URL, verify `CLINK_API_URL` is correct
350
+
351
+ ### Tools not appearing
352
+
353
+ 1. Restart your tool after modifying the MCP configuration
354
+ 2. Check your tool's logs for MCP startup errors
355
+ 3. Verify JSON syntax in your MCP configuration file
356
+
357
+ ## What's Open Source
358
+
359
+ This MCP server is fully open source (MIT license). It contains:
360
+
361
+ - MCP protocol implementation
362
+ - Tool definitions and handlers
363
+ - HTTP client for the Clink API
364
+
365
+ **Not included** (proprietary hosted service):
366
+
367
+ - Clink API backend
368
+ - Web dashboard
369
+ - Billing/subscription logic
370
+
371
+ You can inspect every line of code that runs on your machine.
372
+
373
+ ## Links
374
+
375
+ - [Clink Website](https://clink.voxos.ai)
376
+ - [Documentation](https://docs.clink.voxos.ai)
377
+ - [Web Dashboard](https://app.clink.voxos.ai)
378
+ - [GitHub Issues](https://github.com/voxos-ai-inc/clink-mcp-server/issues)
379
+
380
+ ## License
381
+
382
+ MIT License - see [LICENSE](LICENSE) for details.
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Clink API Client
3
+ *
4
+ * HTTP client for communicating with the Clink API using API key authentication.
5
+ */
6
+ import { Group, Member, Clink, InboxResponse, CompleteResponse, Milestone, Project, ProjectStatus, Proposal, FeedbackResponse, FeedbackCategory, PermissionsResponse } from './types.js';
7
+ /**
8
+ * Check if API key is configured
9
+ */
10
+ export declare function isConfigured(): boolean;
11
+ /**
12
+ * Get configuration status message
13
+ */
14
+ export declare function getConfigStatus(): string;
15
+ /**
16
+ * List all groups the user belongs to
17
+ */
18
+ export declare function listGroups(): Promise<Group[]>;
19
+ /**
20
+ * Resolve a group reference (slug or ID) to a group ID.
21
+ * If it looks like a UUID, returns it directly.
22
+ * Otherwise, looks up the group by slug.
23
+ *
24
+ * @param groupRef - Group slug or group ID
25
+ * @returns The group ID
26
+ * @throws ClinkApiError if group is not found
27
+ */
28
+ export declare function resolveGroup(groupRef: string): Promise<string>;
29
+ /**
30
+ * Get details of a specific group
31
+ */
32
+ export declare function getGroup(groupId: string): Promise<Group>;
33
+ /**
34
+ * List members of a group
35
+ */
36
+ export declare function listMembers(groupId: string): Promise<Member[]>;
37
+ export interface GetClinksOptions {
38
+ groupId?: string;
39
+ since?: string;
40
+ limit?: number;
41
+ status?: string;
42
+ forMe?: boolean;
43
+ unreadOnly?: boolean;
44
+ markRead?: boolean;
45
+ }
46
+ /**
47
+ * Get clinks with optional filters
48
+ */
49
+ export declare function getClinks(options?: GetClinksOptions): Promise<Clink[]>;
50
+ /**
51
+ * Mark clinks in groups as read
52
+ */
53
+ export declare function markRead(groupIds: string[]): Promise<{
54
+ marked_read_at: string;
55
+ group_ids: string[];
56
+ }>;
57
+ export interface SendClinkOptions {
58
+ forRecipient?: string;
59
+ }
60
+ /**
61
+ * Send a clink to a group
62
+ */
63
+ export declare function sendClink(groupId: string, content: string, options?: SendClinkOptions): Promise<Clink>;
64
+ export interface CheckInboxOptions {
65
+ status?: string;
66
+ forMe?: boolean;
67
+ claim?: boolean;
68
+ limit?: number;
69
+ since?: string;
70
+ }
71
+ /**
72
+ * Check inbox with claim/ack support
73
+ */
74
+ export declare function checkInbox(options?: CheckInboxOptions): Promise<InboxResponse>;
75
+ export interface ClaimOptions {
76
+ timeoutSeconds?: number;
77
+ }
78
+ /**
79
+ * Claim a clink for processing
80
+ */
81
+ export declare function claimClink(clinkId: string, options?: ClaimOptions): Promise<Clink>;
82
+ /**
83
+ * Release a claimed clink without completing
84
+ */
85
+ export declare function releaseClink(clinkId: string): Promise<Clink>;
86
+ export interface CompleteOptions {
87
+ response?: string;
88
+ }
89
+ /**
90
+ * Complete a claimed clink
91
+ */
92
+ export declare function completeClink(clinkId: string, options?: CompleteOptions): Promise<CompleteResponse>;
93
+ export interface CreateMilestoneOptions {
94
+ title: string;
95
+ description?: string;
96
+ project_id?: string;
97
+ checkpoints: Array<{
98
+ title: string;
99
+ description?: string;
100
+ requires_consensus?: boolean;
101
+ depends_on?: (number | string)[];
102
+ git_branch_url?: string;
103
+ git_pr_url?: string;
104
+ git_commit_url?: string;
105
+ }>;
106
+ }
107
+ /**
108
+ * Create a milestone with checkpoints
109
+ */
110
+ export declare function createMilestone(groupId: string, options: CreateMilestoneOptions): Promise<Milestone>;
111
+ export interface ListMilestonesOptions {
112
+ status?: 'active' | 'closed';
113
+ limit?: number;
114
+ }
115
+ /**
116
+ * List milestones for a group
117
+ */
118
+ export declare function listMilestones(groupId: string, options?: ListMilestonesOptions): Promise<Milestone[]>;
119
+ /**
120
+ * Get a milestone with its checkpoints
121
+ */
122
+ export declare function getMilestone(milestoneId: string): Promise<Milestone>;
123
+ export interface UpdateMilestoneOptions {
124
+ title?: string;
125
+ description?: string;
126
+ }
127
+ /**
128
+ * Update a milestone
129
+ */
130
+ export declare function updateMilestone(milestoneId: string, options: UpdateMilestoneOptions): Promise<Milestone>;
131
+ /**
132
+ * Complete a checkpoint
133
+ */
134
+ export declare function completeCheckpoint(milestoneId: string, order: number, hilExpirySeconds?: number): Promise<Milestone>;
135
+ export interface UpdateCheckpointOptions {
136
+ title?: string;
137
+ description?: string;
138
+ depends_on?: (number | string)[];
139
+ git_branch_url?: string;
140
+ git_pr_url?: string;
141
+ git_commit_url?: string;
142
+ }
143
+ /**
144
+ * Update a checkpoint
145
+ */
146
+ export declare function updateCheckpoint(milestoneId: string, order: number, options: UpdateCheckpointOptions): Promise<Milestone>;
147
+ /**
148
+ * Delete a checkpoint
149
+ */
150
+ export declare function deleteCheckpoint(milestoneId: string, order: number): Promise<Milestone>;
151
+ export interface AddCheckpointOptions {
152
+ title: string;
153
+ description?: string;
154
+ requires_consensus?: boolean;
155
+ depends_on?: (number | string)[];
156
+ git_branch_url?: string;
157
+ git_pr_url?: string;
158
+ git_commit_url?: string;
159
+ position?: number;
160
+ }
161
+ /**
162
+ * Add a checkpoint to an existing milestone
163
+ */
164
+ export declare function addCheckpoint(milestoneId: string, options: AddCheckpointOptions): Promise<Milestone>;
165
+ /**
166
+ * Re-open a closed milestone
167
+ */
168
+ export declare function reopenMilestone(milestoneId: string): Promise<Milestone>;
169
+ export interface CreateProjectOptions {
170
+ title: string;
171
+ description?: string;
172
+ slug?: string;
173
+ color?: string;
174
+ }
175
+ /**
176
+ * Create a project in a group
177
+ */
178
+ export declare function createProject(groupId: string, options: CreateProjectOptions): Promise<Project>;
179
+ export interface ListProjectsOptions {
180
+ status?: ProjectStatus;
181
+ limit?: number;
182
+ }
183
+ /**
184
+ * List projects for a group
185
+ */
186
+ export declare function listProjects(groupId: string, options?: ListProjectsOptions): Promise<Project[]>;
187
+ /**
188
+ * Get a project by ID
189
+ */
190
+ export declare function getProject(projectId: string): Promise<Project>;
191
+ export interface UpdateProjectOptions {
192
+ title?: string;
193
+ description?: string;
194
+ slug?: string;
195
+ color?: string;
196
+ }
197
+ /**
198
+ * Update a project
199
+ */
200
+ export declare function updateProject(projectId: string, options: UpdateProjectOptions): Promise<Project>;
201
+ /**
202
+ * Mark a project as completed
203
+ */
204
+ export declare function completeProject(projectId: string): Promise<Project>;
205
+ /**
206
+ * Archive a project
207
+ */
208
+ export declare function archiveProject(projectId: string): Promise<Project>;
209
+ /**
210
+ * Reopen a completed or archived project
211
+ */
212
+ export declare function reopenProject(projectId: string): Promise<Project>;
213
+ export interface ListProjectMilestonesOptions {
214
+ status?: 'active' | 'closed';
215
+ limit?: number;
216
+ }
217
+ /**
218
+ * List milestones in a project
219
+ */
220
+ export declare function listProjectMilestones(projectId: string, options?: ListProjectMilestonesOptions): Promise<Milestone[]>;
221
+ export interface CreateProposalOptions {
222
+ title: string;
223
+ description?: string;
224
+ voting_type?: 'single' | 'yes_no' | 'ranked';
225
+ threshold_type?: 'majority' | 'two_thirds' | 'unanimous' | 'quorum';
226
+ options?: string[];
227
+ deadline_hours?: number;
228
+ }
229
+ /**
230
+ * Create a voting proposal
231
+ */
232
+ export declare function createProposal(groupId: string, options: CreateProposalOptions): Promise<Proposal>;
233
+ export interface ListProposalsOptions {
234
+ status?: 'open' | 'finalized';
235
+ limit?: number;
236
+ }
237
+ /**
238
+ * List proposals for a group
239
+ */
240
+ export declare function listProposals(groupId: string, options?: ListProposalsOptions): Promise<Proposal[]>;
241
+ /**
242
+ * Get a proposal with votes
243
+ */
244
+ export declare function getProposal(proposalId: string): Promise<Proposal>;
245
+ export interface CastVoteOptions {
246
+ vote: string;
247
+ comment?: string;
248
+ hil_expiry_seconds?: number;
249
+ }
250
+ /**
251
+ * Cast a vote on a proposal
252
+ */
253
+ export declare function castVote(proposalId: string, options: CastVoteOptions): Promise<Proposal>;
254
+ export interface FinalizeProposalOptions {
255
+ total_eligible_voters?: number;
256
+ }
257
+ /**
258
+ * Finalize a proposal and compute result
259
+ */
260
+ export declare function finalizeProposal(proposalId: string, options?: FinalizeProposalOptions): Promise<Proposal>;
261
+ export interface SubmitFeedbackOptions {
262
+ category: FeedbackCategory;
263
+ content: string;
264
+ context?: {
265
+ tool?: string;
266
+ version?: string;
267
+ [key: string]: string | undefined;
268
+ };
269
+ }
270
+ /**
271
+ * Submit feedback to help improve Clink.
272
+ * Requires an API key with feedback permission enabled.
273
+ */
274
+ export declare function submitFeedback(options: SubmitFeedbackOptions): Promise<FeedbackResponse>;
275
+ /**
276
+ * Get the permissions for the currently authenticated API key.
277
+ */
278
+ export declare function getMyPermissions(): Promise<PermissionsResponse>;
279
+ import { PendingVerification } from './types.js';
280
+ /**
281
+ * List pending HIL verifications for a group.
282
+ * Useful for agents to see what's awaiting human approval.
283
+ */
284
+ export declare function listPendingVerifications(groupId: string, limit?: number): Promise<PendingVerification[]>;
285
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}