veryfront 0.1.621 → 0.1.623
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/esm/deno.js +1 -1
- package/esm/src/agent/runtime/chat-stream-handler.d.ts.map +1 -1
- package/esm/src/agent/runtime/chat-stream-handler.js +13 -1
- package/esm/src/integrations/_data.js +1 -1
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +1 -1
package/esm/deno.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-stream-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/chat-stream-handler.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAiBtF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,KAAK,IAAI,CAAC;CACZ;
|
|
1
|
+
{"version":3,"file":"chat-stream-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/chat-stream-handler.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAiBtF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,KAAK,IAAI,CAAC;CACZ;AA+KD,wBAAgB,iBAAiB,IAAI,eAAe,CAQnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,+BAA+B,EAC3C,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,CAAC,EAAE,mBAAmB,EAC/B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,CAqbf"}
|
|
@@ -136,6 +136,17 @@ async function readNextStreamPartWithTimeout(iterator, state, timeoutMs) {
|
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
}
|
|
139
|
+
function requestStreamIteratorReturn(iterator) {
|
|
140
|
+
const returnResult = iterator.return?.();
|
|
141
|
+
if (!returnResult) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
void Promise.resolve(returnResult).catch((error) => {
|
|
145
|
+
logger.warn("Runtime stream iterator return failed after local tool-call handoff", {
|
|
146
|
+
error: getStreamErrorMessage(error),
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
}
|
|
139
150
|
export function createStreamState() {
|
|
140
151
|
return {
|
|
141
152
|
accumulatedText: "",
|
|
@@ -274,7 +285,8 @@ export function processStream(result, state, controller, encoder, textPartId, ca
|
|
|
274
285
|
? await readNextStreamPartWithTimeout(streamIterator, state, LOCAL_TOOL_COMMIT_GRACE_MS)
|
|
275
286
|
: await readNextStreamPart(streamIterator, state);
|
|
276
287
|
if (next === "timeout") {
|
|
277
|
-
|
|
288
|
+
state.finishReason ??= "tool-calls";
|
|
289
|
+
requestStreamIteratorReturn(streamIterator);
|
|
278
290
|
break;
|
|
279
291
|
}
|
|
280
292
|
if (next.done) {
|
|
@@ -12,7 +12,7 @@ export const connectors = [
|
|
|
12
12
|
{ "name": "github", "displayName": "GitHub", "icon": "github.svg", "description": "Manage repositories, issues, and pull requests", "auth": { "type": "oauth2", "provider": "github", "authorizationUrl": "https://github.com/login/oauth/authorize", "tokenUrl": "https://github.com/login/oauth/access_token", "scopes": ["repo", "read:user", "read:org"] }, "envVars": [{ "name": "GITHUB_CLIENT_ID", "description": "GitHub OAuth App Client ID", "required": true, "sensitive": false, "docsUrl": "https://github.com/settings/developers" }, { "name": "GITHUB_CLIENT_SECRET", "description": "GitHub OAuth App Client Secret", "required": true, "sensitive": true, "docsUrl": "https://github.com/settings/developers" }], "tools": [{ "id": "get_current_user", "name": "Get Current User", "description": "Get the authenticated GitHub user identity", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.github.com/user" } }, { "id": "list_repos", "name": "List Repositories", "description": "Get list of user's repositories", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.github.com/user/repos", "params": { "type": { "type": "string", "in": "query", "description": "Type: all, owner, public, private, member" }, "sort": { "type": "string", "in": "query", "description": "Sort: created, updated, pushed, full_name", "default": "updated" }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 30 }, "page": { "type": "number", "in": "query", "description": "Page number for pagination" } }, "response": { "historicalSummary": { "collectionKeys": ["repositories", "data"], "collectionName": "repositories", "itemFields": [{ "name": "id" }, { "name": "node_id" }, { "name": "name" }, { "name": "full_name" }, { "name": "owner", "kind": "contact" }, { "name": "html_url" }, { "name": "private" }, { "name": "archived" }, { "name": "open_issues_count" }, { "name": "default_branch" }, { "name": "updated_at" }, { "name": "pushed_at" }], "omitted": "repository descriptions and provider-specific payload fields" } } } }, { "id": "get_user", "name": "Get User", "description": "Get a GitHub user profile by username. Use this to verify repository owners, assignees, and other GitHub usernames before acting.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.github.com/users/{username}", "params": { "username": { "type": "string", "in": "path", "description": "GitHub username/login to look up", "required": true } } } }, { "id": "get_repo", "name": "Get Repository", "description": "Get details of a specific repository", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.github.com/repos/{owner}/{repo}", "params": { "owner": { "type": "string", "in": "path", "description": "Repository owner", "required": true }, "repo": { "type": "string", "in": "path", "description": "Repository name", "required": true } } } }, { "id": "list_prs", "name": "List Pull Requests", "description": "Get pull requests for a repository", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.github.com/repos/{owner}/{repo}/pulls", "params": { "owner": { "type": "string", "in": "path", "description": "Repository owner", "required": true }, "repo": { "type": "string", "in": "path", "description": "Repository name", "required": true }, "state": { "type": "string", "in": "query", "description": "State: open, closed, all", "default": "open" }, "per_page": { "type": "number", "in": "query", "description": "Results per page", "default": 30 }, "page": { "type": "number", "in": "query", "description": "Page number for pagination" } }, "response": { "historicalSummary": { "collectionKeys": ["pullRequests", "data"], "collectionName": "pullRequests", "itemFields": [{ "name": "id" }, { "name": "node_id" }, { "name": "number" }, { "name": "title" }, { "name": "state" }, { "name": "html_url" }, { "name": "user", "kind": "contact" }, { "name": "created_at" }, { "name": "updated_at" }, { "name": "closed_at" }, { "name": "merged_at" }, { "name": "draft" }], "omitted": "pull request bodies, diff details, and provider-specific payload fields" } } } }, { "id": "create_issue", "name": "Create Issue", "description": "Create a new issue in a repository", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://api.github.com/repos/{owner}/{repo}/issues", "params": { "owner": { "type": "string", "in": "path", "description": "Repository owner", "required": true }, "repo": { "type": "string", "in": "path", "description": "Repository name", "required": true } }, "body": { "title": { "type": "string", "description": "Issue title", "required": true }, "body": { "type": "string", "description": "Issue body (markdown)" }, "labels": { "type": "array", "description": "Label names" }, "assignees": { "type": "array", "description": "Usernames to assign" } } } }, { "id": "get_pr_diff", "name": "Get PR Diff", "description": "Get the diff for a pull request", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.github.com/repos/{owner}/{repo}/pulls/{pull_number}", "params": { "owner": { "type": "string", "in": "path", "description": "Repository owner", "required": true }, "repo": { "type": "string", "in": "path", "description": "Repository name", "required": true }, "pull_number": { "type": "number", "in": "path", "description": "Pull request number", "required": true }, "Accept": { "type": "string", "in": "header", "description": "Response format", "default": "application/vnd.github.v3.diff" } } } }, { "id": "list_issues", "name": "List Issues", "description": "List issues for a repository", "requiresWrite": false, "endpoint": { "type": "graphql", "method": "POST", "url": "https://api.github.com/graphql", "query": "query($owner: String!, $repo: String!, $first: Int, $states: [IssueState!]) { repository(owner: $owner, name: $repo) { issues(first: $first, states: $states, orderBy: { field: UPDATED_AT, direction: DESC }) { nodes { id number title body state url createdAt updatedAt author { login } labels(first: 10) { nodes { name } } assignees(first: 10) { nodes { login } } } pageInfo { hasNextPage endCursor } } } }", "params": { "owner": { "type": "string", "in": "body", "description": "Repository owner", "required": true }, "repo": { "type": "string", "in": "body", "description": "Repository name", "required": true }, "states": { "type": "string[]", "in": "body", "description": "Issue states to include (e.g. OPEN, CLOSED)", "default": ["OPEN"] }, "first": { "type": "number", "in": "body", "description": "Results per page", "default": 30 } }, "response": { "transform": "repository.issues.nodes", "historicalSummary": { "collectionKeys": ["issues", "nodes", "data"], "collectionName": "issues", "itemFields": [{ "name": "id" }, { "name": "node_id" }, { "name": "number" }, { "name": "title" }, { "name": "state" }, { "name": "url" }, { "name": "html_url" }, { "name": "author", "kind": "contact" }, { "name": "user", "kind": "contact" }, { "name": "createdAt" }, { "name": "updatedAt" }, { "name": "created_at" }, { "name": "updated_at" }], "outputFields": [{ "name": "pageInfo", "kind": "object" }], "omitted": "issue bodies, comments, and provider-specific payload fields" } } } }, { "id": "get_issue", "name": "Get Issue", "description": "Get details of a GitHub issue", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.github.com/repos/{owner}/{repo}/issues/{issue_number}", "params": { "owner": { "type": "string", "in": "path", "description": "Repository owner", "required": true }, "repo": { "type": "string", "in": "path", "description": "Repository name", "required": true }, "issue_number": { "type": "number", "in": "path", "description": "Issue number", "required": true } }, "response": { "historicalSummary": { "collectionKeys": ["issue", "data"], "collectionName": "issues", "itemFields": [{ "name": "id" }, { "name": "node_id" }, { "name": "number" }, { "name": "title" }, { "name": "state" }, { "name": "html_url" }, { "name": "url" }, { "name": "user", "kind": "contact" }, { "name": "author", "kind": "contact" }, { "name": "created_at" }, { "name": "updated_at" }, { "name": "closed_at" }, { "name": "createdAt" }, { "name": "updatedAt" }], "singleItem": true, "omitted": "issue body, comments, timeline, and provider-specific payload fields" } } } }, { "id": "update_issue", "name": "Update Issue", "description": "Update, close, or reopen a GitHub issue", "requiresWrite": true, "endpoint": { "method": "PATCH", "url": "https://api.github.com/repos/{owner}/{repo}/issues/{issue_number}", "params": { "owner": { "type": "string", "in": "path", "description": "Repository owner", "required": true }, "repo": { "type": "string", "in": "path", "description": "Repository name", "required": true }, "issue_number": { "type": "number", "in": "path", "description": "Issue number", "required": true } }, "body": { "title": { "type": "string", "description": "Updated issue title" }, "body": { "type": "string", "description": "Updated issue body (markdown)" }, "state": { "type": "string", "description": "Issue state: open or closed" }, "labels": { "type": "array", "description": "Replacement label names" }, "assignees": { "type": "array", "description": "Replacement assignee usernames" } } } }, { "id": "add_issue_comment", "name": "Add Issue Comment", "description": "Add a comment to a GitHub issue or pull request", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://api.github.com/repos/{owner}/{repo}/issues/{issue_number}/comments", "params": { "owner": { "type": "string", "in": "path", "description": "Repository owner", "required": true }, "repo": { "type": "string", "in": "path", "description": "Repository name", "required": true }, "issue_number": { "type": "number", "in": "path", "description": "Issue or pull request number", "required": true } }, "body": { "body": { "type": "string", "description": "Comment body (markdown)", "required": true } } } }, { "id": "get_pr", "name": "Get Pull Request", "description": "Get details of a specific pull request (title, body, status, author, reviewers, labels)", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.github.com/repos/{owner}/{repo}/pulls/{pull_number}", "params": { "owner": { "type": "string", "in": "path", "description": "Repository owner", "required": true }, "repo": { "type": "string", "in": "path", "description": "Repository name", "required": true }, "pull_number": { "type": "number", "in": "path", "description": "Pull request number", "required": true } }, "response": { "historicalSummary": { "collectionKeys": ["pullRequest", "data"], "collectionName": "pullRequests", "itemFields": [{ "name": "id" }, { "name": "node_id" }, { "name": "number" }, { "name": "title" }, { "name": "state" }, { "name": "html_url" }, { "name": "url" }, { "name": "user", "kind": "contact" }, { "name": "author", "kind": "contact" }, { "name": "created_at" }, { "name": "updated_at" }, { "name": "closed_at" }, { "name": "merged_at" }, { "name": "createdAt" }, { "name": "updatedAt" }, { "name": "draft" }, { "name": "mergeable" }], "singleItem": true, "omitted": "pull request body, diff, reviews, and provider-specific payload fields" } } } }, { "id": "create_pr", "name": "Create Pull Request", "description": "Create a new pull request in a repository", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://api.github.com/repos/{owner}/{repo}/pulls", "params": { "owner": { "type": "string", "in": "path", "description": "Repository owner", "required": true }, "repo": { "type": "string", "in": "path", "description": "Repository name", "required": true } }, "body": { "title": { "type": "string", "description": "PR title", "required": true }, "body": { "type": "string", "description": "PR description (markdown)" }, "head": { "type": "string", "description": "Branch to merge from (e.g. feature-branch or owner:feature-branch)", "required": true }, "base": { "type": "string", "description": "Branch to merge into (e.g. main)", "required": true }, "draft": { "type": "boolean", "description": "Create as draft PR", "default": false } } } }, { "id": "merge_pr", "name": "Merge Pull Request", "description": "Merge an open pull request", "requiresWrite": true, "endpoint": { "method": "PUT", "url": "https://api.github.com/repos/{owner}/{repo}/pulls/{pull_number}/merge", "params": { "owner": { "type": "string", "in": "path", "description": "Repository owner", "required": true }, "repo": { "type": "string", "in": "path", "description": "Repository name", "required": true }, "pull_number": { "type": "number", "in": "path", "description": "Pull request number to merge", "required": true } }, "body": { "commit_title": { "type": "string", "description": "Merge commit title" }, "commit_message": { "type": "string", "description": "Merge commit message" }, "merge_method": { "type": "string", "description": "Merge method: merge, squash, or rebase", "default": "merge" } } } }, { "id": "list_commits", "name": "List Commits", "description": "List commits for a repository, branch, or file path", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.github.com/repos/{owner}/{repo}/commits", "params": { "owner": { "type": "string", "in": "path", "description": "Repository owner", "required": true }, "repo": { "type": "string", "in": "path", "description": "Repository name", "required": true }, "sha": { "type": "string", "in": "query", "description": "SHA or branch name to list commits from" }, "path": { "type": "string", "in": "query", "description": "Only include commits touching this file path" }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 30 }, "page": { "type": "number", "in": "query", "description": "Page number for pagination" } }, "response": { "historicalSummary": { "collectionKeys": ["commits", "data"], "collectionName": "commits", "itemFields": [{ "name": "sha" }, { "name": "node_id" }, { "name": "html_url" }, { "name": "author", "kind": "contact" }, { "name": "committer", "kind": "contact" }], "omitted": "full commit messages, verification payloads, and file details" } } } }], "prompts": [{ "id": "review_prs", "title": "Review my open PRs", "prompt": "Show me my open pull requests and help me review them. Summarize the changes and any comments.", "category": "development", "icon": "git-pull-request" }, { "id": "create_issue", "title": "Create GitHub issue", "prompt": "Help me create a new GitHub issue with a clear description and appropriate labels.", "category": "development", "icon": "circle-dot" }, { "id": "summarize_commits", "title": "Summarize recent commits", "prompt": "Summarize the recent commits in my repository and highlight significant changes.", "category": "development", "icon": "git-commit" }], "suggestedWith": ["jira", "slack"] },
|
|
13
13
|
{ "name": "gitlab", "displayName": "GitLab", "icon": "gitlab.svg", "description": "Search and manage GitLab issues, merge requests, and projects", "auth": { "type": "oauth2", "provider": "gitlab", "authorizationUrl": "https://gitlab.com/oauth/authorize", "tokenUrl": "https://gitlab.com/oauth/token", "scopes": ["api", "read_user", "read_repository"], "tokenAuthMethod": "body", "requiredApis": [{ "name": "GitLab Application", "enableUrl": "https://gitlab.com/-/profile/applications" }] }, "envVars": [{ "name": "GITLAB_CLIENT_ID", "description": "GitLab OAuth Application ID", "required": true, "sensitive": false, "docsUrl": "https://docs.gitlab.com/ee/api/oauth2.html" }, { "name": "GITLAB_CLIENT_SECRET", "description": "GitLab OAuth Application Secret", "required": true, "sensitive": true, "docsUrl": "https://docs.gitlab.com/ee/api/oauth2.html" }], "tools": [{ "id": "list_projects", "name": "List Projects", "description": "List accessible GitLab projects", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gitlab.com/api/v4/projects", "params": { "membership": { "type": "boolean", "in": "query", "description": "Only return projects the user is a member of", "default": true }, "search": { "type": "string", "in": "query", "description": "Search text for projects" }, "simple": { "type": "boolean", "in": "query", "description": "Return simplified project objects", "default": true }, "page": { "type": "number", "in": "query", "description": "Result page", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page", "default": 20 } } } }, { "id": "get_project", "name": "Get Project", "description": "Get detailed information about a GitLab project", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gitlab.com/api/v4/projects/{projectId}", "params": { "projectId": { "type": "string", "in": "path", "description": "GitLab numeric project ID or raw namespace/project path", "required": true } } } }, { "id": "search_issues", "name": "Search Issues", "description": "Search for issues across projects", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gitlab.com/api/v4/issues", "params": { "search": { "type": "string", "in": "query", "description": "Search text for issue title or description" }, "state": { "type": "string", "in": "query", "description": "Issue state", "default": "opened" }, "scope": { "type": "string", "in": "query", "description": "Issue scope such as created_by_me, assigned_to_me, or all", "default": "assigned_to_me" }, "labels": { "type": "string", "in": "query", "description": "Comma-separated label names" }, "page": { "type": "number", "in": "query", "description": "Result page", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page", "default": 20 } } } }, { "id": "get_issue", "name": "Get Issue", "description": "Get detailed information about a specific issue", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gitlab.com/api/v4/projects/{projectId}/issues/{issueIid}", "params": { "projectId": { "type": "string", "in": "path", "description": "GitLab numeric project ID or raw namespace/project path", "required": true }, "issueIid": { "type": "number", "in": "path", "description": "Project-local issue IID", "required": true } } } }, { "id": "create_issue", "name": "Create Issue", "description": "Create a new issue in a project", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gitlab.com/api/v4/projects/{projectId}/issues", "params": { "projectId": { "type": "string", "in": "path", "description": "GitLab numeric project ID or raw namespace/project path", "required": true } }, "body": { "title": { "type": "string", "description": "Issue title", "required": true }, "description": { "type": "string", "description": "Issue description" }, "labels": { "type": "string", "description": "Comma-separated labels" }, "assignee_ids": { "type": "array", "description": "GitLab user IDs to assign" } } } }, { "id": "update_issue", "name": "Update Issue", "description": "Update, close, or reopen a GitLab issue", "requiresWrite": true, "endpoint": { "method": "PUT", "url": "https://gitlab.com/api/v4/projects/{projectId}/issues/{issueIid}", "params": { "projectId": { "type": "string", "in": "path", "description": "GitLab numeric project ID or raw namespace/project path", "required": true }, "issueIid": { "type": "number", "in": "path", "description": "Project-local issue IID", "required": true } }, "body": { "title": { "type": "string", "description": "Updated issue title" }, "description": { "type": "string", "description": "Updated issue description" }, "state_event": { "type": "string", "description": "close or reopen" }, "labels": { "type": "string", "description": "Comma-separated replacement labels" }, "assignee_ids": { "type": "array", "description": "GitLab user IDs to assign" } } } }, { "id": "add_issue_comment", "name": "Add Issue Comment", "description": "Add a comment/note to a GitLab issue", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gitlab.com/api/v4/projects/{projectId}/issues/{issueIid}/notes", "params": { "projectId": { "type": "string", "in": "path", "description": "GitLab numeric project ID or raw namespace/project path", "required": true }, "issueIid": { "type": "number", "in": "path", "description": "Project-local issue IID", "required": true } }, "body": { "body": { "type": "string", "description": "Comment body in Markdown", "required": true }, "confidential": { "type": "boolean", "description": "Make the note visible only to project members" } } } }, { "id": "list_merge_requests", "name": "List Merge Requests", "description": "List merge requests for a project or across projects", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gitlab.com/api/v4/merge_requests", "params": { "state": { "type": "string", "in": "query", "description": "Merge request state", "default": "opened" }, "scope": { "type": "string", "in": "query", "description": "Merge request scope such as created_by_me, assigned_to_me, or all", "default": "assigned_to_me" }, "search": { "type": "string", "in": "query", "description": "Search text for merge requests" }, "page": { "type": "number", "in": "query", "description": "Result page", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page", "default": 20 } } } }, { "id": "get_merge_request", "name": "Get Merge Request", "description": "Get detailed information about a specific GitLab merge request", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gitlab.com/api/v4/projects/{projectId}/merge_requests/{mergeRequestIid}", "params": { "projectId": { "type": "string", "in": "path", "description": "GitLab numeric project ID or raw namespace/project path", "required": true }, "mergeRequestIid": { "type": "number", "in": "path", "description": "Project-local merge request IID", "required": true } } } }, { "id": "add_merge_request_comment", "name": "Add Merge Request Comment", "description": "Add a comment/note to a GitLab merge request", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gitlab.com/api/v4/projects/{projectId}/merge_requests/{mergeRequestIid}/notes", "params": { "projectId": { "type": "string", "in": "path", "description": "GitLab numeric project ID or raw namespace/project path", "required": true }, "mergeRequestIid": { "type": "number", "in": "path", "description": "Project-local merge request IID", "required": true } }, "body": { "body": { "type": "string", "description": "Comment body in Markdown", "required": true }, "internal": { "type": "boolean", "description": "Make the note internal when supported" } } } }], "prompts": [{ "id": "find_issues", "title": "Find my issues", "prompt": "Search for issues assigned to me that are open. Show me the most important ones.", "category": "development", "icon": "bug" }, { "id": "review_mrs", "title": "Review merge requests", "prompt": "Show me all open merge requests that need my review. Summarize what each one does.", "category": "development", "icon": "git-merge" }, { "id": "create_bug_report", "title": "Create bug report", "prompt": "Help me create a detailed bug report issue with steps to reproduce, expected vs actual behavior.", "category": "development", "icon": "plus" }, { "id": "project_status", "title": "Project status", "prompt": "Give me a summary of my projects: open issues, merge requests, and recent activity.", "category": "development", "icon": "list" }], "suggestedWith": ["github", "jira", "slack"] },
|
|
14
14
|
{ "name": "gmail", "displayName": "Gmail", "icon": "gmail.svg", "description": "Read and send emails via Gmail API", "auth": { "type": "oauth2", "provider": "google", "authorizationUrl": "https://accounts.google.com/o/oauth2/v2/auth", "tokenUrl": "https://oauth2.googleapis.com/token", "scopes": ["https://www.googleapis.com/auth/gmail.readonly", "https://www.googleapis.com/auth/gmail.send", "https://www.googleapis.com/auth/gmail.modify", "https://www.googleapis.com/auth/gmail.labels", "https://www.googleapis.com/auth/gmail.compose", "https://mail.google.com/"], "requiredApis": [{ "name": "Gmail API", "enableUrl": "https://console.cloud.google.com/apis/library/gmail.googleapis.com" }] }, "envVars": [{ "name": "GOOGLE_CLIENT_ID", "description": "Google OAuth Client ID", "required": true, "sensitive": false, "docsUrl": "https://console.cloud.google.com/apis/credentials" }, { "name": "GOOGLE_CLIENT_SECRET", "description": "Google OAuth Client Secret", "required": true, "sensitive": true, "docsUrl": "https://console.cloud.google.com/apis/credentials" }], "tools": [{ "id": "list_emails", "name": "List Emails", "description": "List Gmail message summaries with IDs, sender, recipient, subject, date, snippet, labels, and pagination tokens. Use get-email only when full message content is needed.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages", "params": { "maxResults": { "type": "number", "in": "query", "description": "Maximum number of message summaries to return (1-50)", "default": 20 }, "q": { "type": "string", "in": "query", "description": "Gmail search query (e.g. is:unread, from:user@example.com)" }, "labelIds": { "type": "string[]", "in": "query", "description": "Only return messages with these label IDs (e.g. INBOX, UNREAD)" }, "pageToken": { "type": "string", "in": "query", "description": "Page token for pagination" } }, "response": { "enrich": { "type": "gmail-message-metadata", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{id}", "idField": "id", "metadataHeaders": ["From", "To", "Subject", "Date"], "maxItems": 50 }, "historicalSummary": { "collectionKeys": ["messages", "data"], "collectionName": "messages", "itemFields": [{ "name": "id" }, { "name": "threadId" }, { "name": "from", "kind": "contact" }, { "name": "sender", "kind": "contact" }, { "name": "to" }, { "name": "subject" }, { "name": "date" }, { "name": "internalDate" }, { "name": "snippet", "maxLength": 300 }, { "name": "labelIds", "kind": "string-array" }, { "name": "isUnread" }, { "name": "unread" }], "outputFields": [{ "name": "nextPageToken" }, { "name": "resultSizeEstimate" }], "omitted": "large email bodies and provider-specific payload fields" } } } }, { "id": "send_email", "name": "Send Email", "description": "Send an email to recipients", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/send", "body": { "raw": { "type": "string", "description": "Base64url-encoded RFC 2822 email message", "required": true }, "threadId": { "type": "string", "description": "Thread ID for a reply" } } } }, { "id": "get_email", "name": "Get Email", "description": "Get a specific email by ID with full content", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{messageId}", "params": { "messageId": { "type": "string", "in": "path", "description": "Email message ID", "required": true }, "format": { "type": "string", "in": "query", "description": "Format: full, metadata, minimal, raw", "default": "full" }, "metadataHeaders": { "type": "string[]", "in": "query", "description": "Headers to include when format is metadata, e.g. From, To, Subject, Date" } } } }, { "id": "search_emails", "name": "Search Emails", "description": "Search Gmail messages and return summaries with IDs, sender, recipient, subject, date, snippet, labels, and pagination tokens.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages", "params": { "q": { "type": "string", "in": "query", "description": "Gmail search query", "required": true }, "maxResults": { "type": "number", "in": "query", "description": "Maximum number of message summaries to return (1-50)", "default": 10 }, "pageToken": { "type": "string", "in": "query", "description": "Page token for pagination" } }, "response": { "enrich": { "type": "gmail-message-metadata", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{id}", "idField": "id", "metadataHeaders": ["From", "To", "Subject", "Date"], "maxItems": 50 }, "historicalSummary": { "collectionKeys": ["messages", "data"], "collectionName": "messages", "itemFields": [{ "name": "id" }, { "name": "threadId" }, { "name": "from", "kind": "contact" }, { "name": "sender", "kind": "contact" }, { "name": "to" }, { "name": "subject" }, { "name": "date" }, { "name": "internalDate" }, { "name": "snippet", "maxLength": 300 }, { "name": "labelIds", "kind": "string-array" }, { "name": "isUnread" }, { "name": "unread" }], "outputFields": [{ "name": "nextPageToken" }, { "name": "resultSizeEstimate" }], "omitted": "large email bodies and provider-specific payload fields" } } } }, { "id": "mark_email_read", "name": "Mark Email Read", "description": "Mark an email as read", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{messageId}/modify", "params": { "messageId": { "type": "string", "in": "path", "description": "Email message ID", "required": true } }, "body": { "removeLabelIds": { "type": "array", "description": "Label IDs to remove, use UNREAD", "default": ["UNREAD"] } } } }, { "id": "archive_email", "name": "Archive Email", "description": "Archive an email", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{messageId}/modify", "params": { "messageId": { "type": "string", "in": "path", "description": "Email message ID", "required": true } }, "body": { "removeLabelIds": { "type": "array", "description": "Label IDs to remove, use INBOX", "default": ["INBOX"] } } } }, { "id": "list_labels", "name": "List Labels", "description": "List Gmail labels", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gmail.googleapis.com/gmail/v1/users/me/labels", "response": { "transform": "labels" } } }, { "id": "get_label", "name": "Get Label", "description": "Get a Gmail label", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gmail.googleapis.com/gmail/v1/users/me/labels/{labelId}", "params": { "labelId": { "type": "string", "in": "path", "description": "Label ID", "required": true } } } }, { "id": "create_label", "name": "Create Label", "description": "Create a Gmail user label", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gmail.googleapis.com/gmail/v1/users/me/labels", "body": { "name": { "type": "string", "description": "Label display name", "required": true }, "messageListVisibility": { "type": "string", "description": "Message list visibility: show or hide" }, "labelListVisibility": { "type": "string", "description": "Label list visibility" }, "color": { "type": "object", "description": "Label color object" } } } }, { "id": "update_label", "name": "Update Label", "description": "Update a Gmail user label", "requiresWrite": true, "endpoint": { "method": "PUT", "url": "https://gmail.googleapis.com/gmail/v1/users/me/labels/{labelId}", "params": { "labelId": { "type": "string", "in": "path", "description": "Label ID", "required": true } }, "body": { "name": { "type": "string", "description": "Label display name", "required": true }, "messageListVisibility": { "type": "string", "description": "Message list visibility: show or hide" }, "labelListVisibility": { "type": "string", "description": "Label list visibility" }, "color": { "type": "object", "description": "Label color object" } } } }, { "id": "delete_label", "name": "Delete Label", "description": "Delete a Gmail user label", "requiresWrite": true, "endpoint": { "method": "DELETE", "url": "https://gmail.googleapis.com/gmail/v1/users/me/labels/{labelId}", "params": { "labelId": { "type": "string", "in": "path", "description": "Label ID", "required": true } } } }, { "id": "apply_labels", "name": "Apply Labels", "description": "Apply or remove labels on an email", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{messageId}/modify", "params": { "messageId": { "type": "string", "in": "path", "description": "Email message ID", "required": true } }, "body": { "addLabelIds": { "type": "array", "description": "Label IDs to add" }, "removeLabelIds": { "type": "array", "description": "Label IDs to remove" } } } }, { "id": "modify_email_labels", "name": "Modify Email Labels", "description": "Modify labels on an email", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{messageId}/modify", "params": { "messageId": { "type": "string", "in": "path", "description": "Email message ID", "required": true } }, "body": { "addLabelIds": { "type": "array", "description": "Label IDs to add" }, "removeLabelIds": { "type": "array", "description": "Label IDs to remove" } } } }, { "id": "trash_email", "name": "Trash Email", "description": "Move an email to trash", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{messageId}/trash", "params": { "messageId": { "type": "string", "in": "path", "description": "Email message ID", "required": true } } } }, { "id": "untrash_email", "name": "Untrash Email", "description": "Remove an email from trash", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{messageId}/untrash", "params": { "messageId": { "type": "string", "in": "path", "description": "Email message ID", "required": true } } } }, { "id": "delete_email", "name": "Delete Email", "description": "Permanently delete an email", "requiresWrite": true, "endpoint": { "method": "DELETE", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{messageId}", "params": { "messageId": { "type": "string", "in": "path", "description": "Email message ID", "required": true } } } }, { "id": "batch_modify_emails", "name": "Batch Modify Emails", "description": "Modify labels on multiple emails", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/batchModify", "body": { "ids": { "type": "array", "description": "Email message IDs", "required": true }, "addLabelIds": { "type": "array", "description": "Label IDs to add" }, "removeLabelIds": { "type": "array", "description": "Label IDs to remove" } } } }, { "id": "batch_delete_emails", "name": "Batch Delete Emails", "description": "Permanently delete multiple emails", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/batchDelete", "body": { "ids": { "type": "array", "description": "Email message IDs", "required": true } } } }, { "id": "list_threads", "name": "List Threads", "description": "List Gmail threads", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gmail.googleapis.com/gmail/v1/users/me/threads", "params": { "maxResults": { "type": "number", "in": "query", "description": "Maximum number of threads to return (1-500)", "default": 20 }, "q": { "type": "string", "in": "query", "description": "Gmail search query" }, "labelIds": { "type": "string[]", "in": "query", "description": "Only return threads with these label IDs" }, "pageToken": { "type": "string", "in": "query", "description": "Page token for pagination" } }, "response": { "transform": "threads" } } }, { "id": "get_thread", "name": "Get Thread", "description": "Get a Gmail thread", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gmail.googleapis.com/gmail/v1/users/me/threads/{threadId}", "params": { "threadId": { "type": "string", "in": "path", "description": "Thread ID", "required": true }, "format": { "type": "string", "in": "query", "description": "Format: full, metadata, minimal", "default": "full" } } } }, { "id": "modify_thread_labels", "name": "Modify Thread Labels", "description": "Modify labels on a Gmail thread", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gmail.googleapis.com/gmail/v1/users/me/threads/{threadId}/modify", "params": { "threadId": { "type": "string", "in": "path", "description": "Thread ID", "required": true } }, "body": { "addLabelIds": { "type": "array", "description": "Label IDs to add" }, "removeLabelIds": { "type": "array", "description": "Label IDs to remove" } } } }, { "id": "trash_thread", "name": "Trash Thread", "description": "Move a Gmail thread to trash", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gmail.googleapis.com/gmail/v1/users/me/threads/{threadId}/trash", "params": { "threadId": { "type": "string", "in": "path", "description": "Thread ID", "required": true } } } }, { "id": "untrash_thread", "name": "Untrash Thread", "description": "Remove a Gmail thread from trash", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gmail.googleapis.com/gmail/v1/users/me/threads/{threadId}/untrash", "params": { "threadId": { "type": "string", "in": "path", "description": "Thread ID", "required": true } } } }, { "id": "delete_thread", "name": "Delete Thread", "description": "Permanently delete a Gmail thread", "requiresWrite": true, "endpoint": { "method": "DELETE", "url": "https://gmail.googleapis.com/gmail/v1/users/me/threads/{threadId}", "params": { "threadId": { "type": "string", "in": "path", "description": "Thread ID", "required": true } } } }, { "id": "create_draft", "name": "Create Draft", "description": "Create a Gmail draft", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gmail.googleapis.com/gmail/v1/users/me/drafts", "body": { "message": { "type": "object", "description": "Draft message containing raw RFC 2822 content", "required": true } } } }, { "id": "list_drafts", "name": "List Drafts", "description": "List Gmail drafts", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gmail.googleapis.com/gmail/v1/users/me/drafts", "params": { "maxResults": { "type": "number", "in": "query", "description": "Maximum number of drafts to return (1-500)", "default": 20 }, "q": { "type": "string", "in": "query", "description": "Gmail search query" }, "pageToken": { "type": "string", "in": "query", "description": "Page token for pagination" } }, "response": { "transform": "drafts" } } }, { "id": "get_draft", "name": "Get Draft", "description": "Get a Gmail draft", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gmail.googleapis.com/gmail/v1/users/me/drafts/{draftId}", "params": { "draftId": { "type": "string", "in": "path", "description": "Draft ID", "required": true }, "format": { "type": "string", "in": "query", "description": "Format: full, metadata, minimal, raw", "default": "full" } } } }, { "id": "update_draft", "name": "Update Draft", "description": "Replace a Gmail draft", "requiresWrite": true, "endpoint": { "method": "PUT", "url": "https://gmail.googleapis.com/gmail/v1/users/me/drafts/{draftId}", "params": { "draftId": { "type": "string", "in": "path", "description": "Draft ID", "required": true } }, "body": { "message": { "type": "object", "description": "Draft message containing raw RFC 2822 content", "required": true } } } }, { "id": "send_draft", "name": "Send Draft", "description": "Send an existing Gmail draft", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://gmail.googleapis.com/gmail/v1/users/me/drafts/send", "body": { "id": { "type": "string", "description": "Draft ID", "required": true } } } }, { "id": "delete_draft", "name": "Delete Draft", "description": "Permanently delete a Gmail draft", "requiresWrite": true, "endpoint": { "method": "DELETE", "url": "https://gmail.googleapis.com/gmail/v1/users/me/drafts/{draftId}", "params": { "draftId": { "type": "string", "in": "path", "description": "Draft ID", "required": true } } } }, { "id": "get_attachment", "name": "Get Attachment", "description": "Get a Gmail message attachment", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{messageId}/attachments/{attachmentId}", "params": { "messageId": { "type": "string", "in": "path", "description": "Email message ID", "required": true }, "attachmentId": { "type": "string", "in": "path", "description": "Attachment ID", "required": true } } } }, { "id": "get_profile", "name": "Get Profile", "description": "Get the Gmail mailbox profile", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gmail.googleapis.com/gmail/v1/users/me/profile" } }, { "id": "list_history", "name": "List History", "description": "List Gmail mailbox history changes", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://gmail.googleapis.com/gmail/v1/users/me/history", "params": { "startHistoryId": { "type": "string", "in": "query", "description": "History ID to start after", "required": true }, "maxResults": { "type": "number", "in": "query", "description": "Maximum history records", "default": 100 }, "pageToken": { "type": "string", "in": "query", "description": "Page token for pagination" }, "labelId": { "type": "string", "in": "query", "description": "Only return history for this label" }, "historyTypes": { "type": "string[]", "in": "query", "description": "History event types" } } } }], "prompts": [{ "id": "summarize_emails", "title": "Summarize today's emails", "prompt": "Summarize my unread emails from today. Group them by priority and highlight any that need immediate attention.", "category": "productivity", "icon": "mail" }, { "id": "draft_reply", "title": "Draft a quick reply", "prompt": "Help me draft a reply to my most recent email. Keep it professional and concise.", "category": "productivity", "icon": "reply" }, { "id": "find_emails", "title": "Find important emails", "prompt": "Search my emails for important messages from the past week that I might have missed.", "category": "productivity", "icon": "search" }], "suggestedWith": ["calendar", "slack"] },
|
|
15
|
-
{ "name": "harvest", "displayName": "Harvest", "icon": "harvest.svg", "description": "Track time, manage projects, and control invoices with Harvest — trusted by 70,000+ businesses", "auth": { "type": "oauth2", "provider": "harvest", "authorizationUrl": "https://id.getharvest.com/oauth2/authorize", "tokenUrl": "https://id.getharvest.com/api/v2/oauth2/token", "requiredApis": [{ "name": "Harvest OAuth2 Application", "enableUrl": "https://id.getharvest.com/developers" }] }, "envVars": [{ "name": "HARVEST_CLIENT_ID", "description": "Harvest OAuth2 Client ID (from your OAuth2 application in Harvest ID)", "required": true, "sensitive": false, "docsUrl": "https://id.getharvest.com/developers" }, { "name": "HARVEST_CLIENT_SECRET", "description": "Harvest OAuth2 Client Secret", "required": true, "sensitive": true, "docsUrl": "https://id.getharvest.com/developers" }], "tools": [{ "id": "list_accounts", "name": "List Accounts", "description": "List all Harvest accounts the authenticated user can access. Call this first to get your Harvest-Account-Id for subsequent API calls.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://id.getharvest.com/api/v2/accounts", "response": { "transform": "accounts" } } }, { "id": "get_current_user", "name": "Get Current User", "description": "Get the authenticated user's Harvest profile (id, name, email, timezone, roles)", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/users/me", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true } } } }, { "id": "list_users", "name": "List Users", "description": "List all active users in the Harvest account", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/users", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "is_active": { "type": "boolean", "in": "query", "description": "Filter by active status", "default": true }, "updated_since": { "type": "string", "in": "query", "description": "Only return users updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "users" } } }, { "id": "list_time_entries", "name": "List Time Entries", "description": "List time entries (timesheets). Filter by user, project, client, or date range.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/time_entries", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "user_id": { "type": "number", "in": "query", "description": "Filter by user ID" }, "client_id": { "type": "number", "in": "query", "description": "Filter by client ID" }, "project_id": { "type": "number", "in": "query", "description": "Filter by project ID" }, "task_id": { "type": "number", "in": "query", "description": "Filter by task ID" }, "is_running": { "type": "boolean", "in": "query", "description": "Filter to only currently running timers" }, "is_billed": { "type": "boolean", "in": "query", "description": "Filter by billed status" }, "from": { "type": "string", "in": "query", "description": "Start date (YYYY-MM-DD). Return entries with spent_date >= from." }, "to": { "type": "string", "in": "query", "description": "End date (YYYY-MM-DD). Return entries with spent_date <= to." }, "updated_since": { "type": "string", "in": "query", "description": "Only return entries updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "time_entries" } } }, { "id": "get_time_entry", "name": "Get Time Entry", "description": "Get details of a specific time entry by ID", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/time_entries/{timeEntryId}", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "timeEntryId": { "type": "number", "in": "path", "description": "Harvest time entry ID", "required": true } } } }, { "id": "create_time_entry", "name": "Create Time Entry", "description": "Create a new time entry (timesheet). Provide either hours or start/end times.", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://api.harvestapp.com/v2/time_entries", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true } }, "body": { "project_id": { "type": "number", "description": "Harvest project ID", "required": true }, "task_id": { "type": "number", "description": "Harvest task ID", "required": true }, "spent_date": { "type": "string", "description": "Date of the time entry (YYYY-MM-DD)", "required": true }, "user_id": { "type": "number", "description": "User ID to log time for (defaults to authenticated user)" }, "hours": { "type": "number", "description": "Hours to log (e.g. 1.5). Use instead of started_time/ended_time." }, "started_time": { "type": "string", "description": "Start time (hh:mmam/pm, e.g. 8:00am). Use with ended_time instead of hours." }, "ended_time": { "type": "string", "description": "End time (hh:mmam/pm, e.g. 5:30pm). Use with started_time instead of hours." }, "notes": { "type": "string", "description": "Notes about the time entry" }, "external_reference": { "type": "object", "description": "External reference object with id, group_id, account_id, permalink" } } } }, { "id": "update_time_entry", "name": "Update Time Entry", "description": "Update an existing time entry", "requiresWrite": true, "endpoint": { "method": "PATCH", "url": "https://api.harvestapp.com/v2/time_entries/{timeEntryId}", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "timeEntryId": { "type": "number", "in": "path", "description": "Harvest time entry ID", "required": true } }, "body": { "project_id": { "type": "number", "description": "Updated project ID" }, "task_id": { "type": "number", "description": "Updated task ID" }, "spent_date": { "type": "string", "description": "Updated date (YYYY-MM-DD)" }, "hours": { "type": "number", "description": "Updated hours" }, "started_time": { "type": "string", "description": "Updated start time (hh:mmam/pm)" }, "ended_time": { "type": "string", "description": "Updated end time (hh:mmam/pm)" }, "notes": { "type": "string", "description": "Updated notes" }, "is_locked": { "type": "boolean", "description": "Lock/unlock the time entry" } } } }, { "id": "delete_time_entry", "name": "Delete Time Entry", "description": "Delete a time entry. Only unlocked, non-billed entries can be deleted.", "requiresWrite": true, "endpoint": { "method": "DELETE", "url": "https://api.harvestapp.com/v2/time_entries/{timeEntryId}", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "timeEntryId": { "type": "number", "in": "path", "description": "Harvest time entry ID", "required": true } } } }, { "id": "stop_timer", "name": "Stop Timer", "description": "Stop a running timer for a time entry", "requiresWrite": true, "endpoint": { "method": "PATCH", "url": "https://api.harvestapp.com/v2/time_entries/{timeEntryId}/stop", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "timeEntryId": { "type": "number", "in": "path", "description": "Harvest time entry ID of the running timer", "required": true } } } }, { "id": "restart_timer", "name": "Restart Timer", "description": "Restart a stopped timer for a time entry", "requiresWrite": true, "endpoint": { "method": "PATCH", "url": "https://api.harvestapp.com/v2/time_entries/{timeEntryId}/restart", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "timeEntryId": { "type": "number", "in": "path", "description": "Harvest time entry ID", "required": true } } } }, { "id": "list_projects", "name": "List Projects", "description": "List all projects in the Harvest account", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/projects", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "is_active": { "type": "boolean", "in": "query", "description": "Filter by active status" }, "client_id": { "type": "number", "in": "query", "description": "Filter by client ID" }, "updated_since": { "type": "string", "in": "query", "description": "Only return projects updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "projects" } } }, { "id": "get_project", "name": "Get Project", "description": "Get details of a specific project", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/projects/{projectId}", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "projectId": { "type": "number", "in": "path", "description": "Harvest project ID", "required": true } } } }, { "id": "list_tasks", "name": "List Tasks", "description": "List all tasks available in the Harvest account", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/tasks", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "is_active": { "type": "boolean", "in": "query", "description": "Filter by active status" }, "updated_since": { "type": "string", "in": "query", "description": "Only return tasks updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "tasks" } } }, { "id": "list_project_task_assignments", "name": "List Project Task Assignments", "description": "List all task assignments for a specific project (tasks billable to this project)", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/projects/{projectId}/task_assignments", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "projectId": { "type": "number", "in": "path", "description": "Harvest project ID", "required": true }, "is_active": { "type": "boolean", "in": "query", "description": "Filter by active status" }, "updated_since": { "type": "string", "in": "query", "description": "Only return task assignments updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "task_assignments" } } }, { "id": "list_clients", "name": "List Clients", "description": "List all clients in the Harvest account", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/clients", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "is_active": { "type": "boolean", "in": "query", "description": "Filter by active status" }, "updated_since": { "type": "string", "in": "query", "description": "Only return clients updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "clients" } } }, { "id": "get_client", "name": "Get Client", "description": "Get details of a specific client", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/clients/{clientId}", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "clientId": { "type": "number", "in": "path", "description": "Harvest client ID", "required": true } } } }, { "id": "list_invoices", "name": "List Invoices", "description": "List all invoices. Filter by client, status, or date range.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/invoices", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "client_id": { "type": "number", "in": "query", "description": "Filter by client ID" }, "project_id": { "type": "number", "in": "query", "description": "Filter by project ID" }, "state": { "type": "string", "in": "query", "description": "Filter by state: draft, open, paid, closed" }, "from": { "type": "string", "in": "query", "description": "Only invoices with issue_date >= from (YYYY-MM-DD)" }, "to": { "type": "string", "in": "query", "description": "Only invoices with issue_date <= to (YYYY-MM-DD)" }, "updated_since": { "type": "string", "in": "query", "description": "Only return invoices updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "invoices" } } }, { "id": "get_invoice", "name": "Get Invoice", "description": "Get details of a specific invoice including line items", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/invoices/{invoiceId}", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "invoiceId": { "type": "number", "in": "path", "description": "Harvest invoice ID", "required": true } } } }, { "id": "create_invoice", "name": "Create Invoice", "description": "Create a new invoice for a client", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://api.harvestapp.com/v2/invoices", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true } }, "body": { "client_id": { "type": "number", "description": "Client ID to invoice", "required": true }, "subject": { "type": "string", "description": "Invoice subject line" }, "notes": { "type": "string", "description": "Invoice notes visible to client" }, "issue_date": { "type": "string", "description": "Issue date (YYYY-MM-DD, defaults to today)" }, "due_date": { "type": "string", "description": "Due date (YYYY-MM-DD)" }, "currency": { "type": "string", "description": "Invoice currency code (e.g. USD, EUR). Defaults to account currency." }, "line_items_import": { "type": "object", "description": "Import time entries/expenses into line items: { project_ids: number[], time: { summary_type, from, to }, expenses: { summary_type, from, to, attach_receipt } }" }, "line_items": { "type": "array", "description": "Manual line items array: [{ kind, description, unit_price, quantity, taxed, taxed2 }]" } } } }, { "id": "update_invoice", "name": "Update Invoice", "description": "Update an existing invoice (subject, notes, dates, line items, state)", "requiresWrite": true, "endpoint": { "method": "PATCH", "url": "https://api.harvestapp.com/v2/invoices/{invoiceId}", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "invoiceId": { "type": "number", "in": "path", "description": "Harvest invoice ID", "required": true } }, "body": { "subject": { "type": "string", "description": "Updated subject" }, "notes": { "type": "string", "description": "Updated notes" }, "issue_date": { "type": "string", "description": "Updated issue date (YYYY-MM-DD)" }, "due_date": { "type": "string", "description": "Updated due date (YYYY-MM-DD)" }, "line_items": { "type": "array", "description": "Updated line items" } } } }, { "id": "list_invoice_payments", "name": "List Invoice Payments", "description": "List all payments recorded for an invoice", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/invoices/{invoiceId}/payments", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "invoiceId": { "type": "number", "in": "path", "description": "Harvest invoice ID", "required": true }, "updated_since": { "type": "string", "in": "query", "description": "Only return payments updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "invoice_payments" } } }, { "id": "create_invoice_payment", "name": "Create Invoice Payment", "description": "Record a payment for an invoice", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://api.harvestapp.com/v2/invoices/{invoiceId}/payments", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "invoiceId": { "type": "number", "in": "path", "description": "Harvest invoice ID", "required": true } }, "body": { "amount": { "type": "number", "description": "Payment amount", "required": true }, "paid_at": { "type": "string", "description": "Payment datetime (ISO 8601, defaults to now)" }, "paid_date": { "type": "string", "description": "Payment date (YYYY-MM-DD, use instead of paid_at for date-only)" }, "notes": { "type": "string", "description": "Payment notes" }, "send_thank_you": { "type": "boolean", "description": "Send a thank-you email to the client", "default": false } } } }, { "id": "time_report_by_project", "name": "Time Report by Project", "description": "Get a time report aggregated by project. Requires from and to date range.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/reports/time/projects", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "from": { "type": "string", "in": "query", "description": "Report start date (YYYY-MM-DD)", "required": true }, "to": { "type": "string", "in": "query", "description": "Report end date (YYYY-MM-DD)", "required": true }, "include_fixed_fee": { "type": "boolean", "in": "query", "description": "Include fixed-fee projects" }, "client_id": { "type": "number", "in": "query", "description": "Filter by client ID" }, "project_id": { "type": "number", "in": "query", "description": "Filter by project ID" }, "user_id": { "type": "number", "in": "query", "description": "Filter by user ID" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "results" } } }, { "id": "time_report_by_team", "name": "Time Report by Team", "description": "Get a time report aggregated by team member. Requires from and to date range.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/reports/time/team", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "from": { "type": "string", "in": "query", "description": "Report start date (YYYY-MM-DD)", "required": true }, "to": { "type": "string", "in": "query", "description": "Report end date (YYYY-MM-DD)", "required": true }, "client_id": { "type": "number", "in": "query", "description": "Filter by client ID" }, "project_id": { "type": "number", "in": "query", "description": "Filter by project ID" }, "user_id": { "type": "number", "in": "query", "description": "Filter by user ID" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "results" } } }, { "id": "time_report_by_client", "name": "Time Report by Client", "description": "Get a time report aggregated by client. Requires from and to date range.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/reports/time/clients", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "from": { "type": "string", "in": "query", "description": "Report start date (YYYY-MM-DD)", "required": true }, "to": { "type": "string", "in": "query", "description": "Report end date (YYYY-MM-DD)", "required": true }, "client_id": { "type": "number", "in": "query", "description": "Filter by client ID" }, "project_id": { "type": "number", "in": "query", "description": "Filter by project ID" }, "user_id": { "type": "number", "in": "query", "description": "Filter by user ID" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "results" } } }, { "id": "time_report_by_task", "name": "Time Report by Task", "description": "Get a time report aggregated by task. Requires from and to date range.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/reports/time/tasks", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "from": { "type": "string", "in": "query", "description": "Report start date (YYYY-MM-DD)", "required": true }, "to": { "type": "string", "in": "query", "description": "Report end date (YYYY-MM-DD)", "required": true }, "client_id": { "type": "number", "in": "query", "description": "Filter by client ID" }, "project_id": { "type": "number", "in": "query", "description": "Filter by project ID" }, "user_id": { "type": "number", "in": "query", "description": "Filter by user ID" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "results" } } }, { "id": "invoice_report", "name": "Invoice Report", "description": "Get an invoiced time and expenses report. Requires from and to date range.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/reports/invoices/invoiced", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "from": { "type": "string", "in": "query", "description": "Report start date (YYYY-MM-DD)", "required": true }, "to": { "type": "string", "in": "query", "description": "Report end date (YYYY-MM-DD)", "required": true }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "results" } } }], "prompts": [{ "id": "log_time", "title": "Log time for today", "prompt": "Log time entries for today. Show me my projects and tasks, then create time entries for the work I describe.", "category": "productivity", "icon": "clock" }, { "id": "weekly_timesheet", "title": "Show weekly timesheet", "prompt": "Show me my time entries for this week grouped by project. Calculate total hours per project and overall.", "category": "productivity", "icon": "calendar" }, { "id": "create_invoice", "title": "Create an invoice", "prompt": "Create a new invoice for a client. Import tracked time entries for the specified period and generate the invoice.", "category": "finance", "icon": "file-text" }, { "id": "invoice_status", "title": "Check invoice status", "prompt": "Show me all open invoices with their amounts, due dates, and payment status. Flag any overdue invoices.", "category": "finance", "icon": "alert-circle" }, { "id": "team_report", "title": "Team time report", "prompt": "Generate a time report for the team this month. Show hours logged per person, per project, and identify anyone who hasn't logged time.", "category": "management", "icon": "users" }], "suggestedWith": ["github", "jira", "slack"] },
|
|
15
|
+
{ "name": "harvest", "displayName": "Harvest", "icon": "harvest.svg", "description": "Track time, manage projects, and control invoices with Harvest — trusted by 70,000+ businesses", "auth": { "type": "oauth2", "provider": "harvest", "authorizationUrl": "https://id.getharvest.com/oauth2/authorize", "tokenUrl": "https://id.getharvest.com/api/v2/oauth2/token", "scopes": [], "requiredApis": [{ "name": "Harvest OAuth2 Application", "enableUrl": "https://id.getharvest.com/developers" }] }, "envVars": [{ "name": "HARVEST_CLIENT_ID", "description": "Harvest OAuth2 Client ID (from your OAuth2 application in Harvest ID)", "required": true, "sensitive": false, "docsUrl": "https://id.getharvest.com/developers" }, { "name": "HARVEST_CLIENT_SECRET", "description": "Harvest OAuth2 Client Secret", "required": true, "sensitive": true, "docsUrl": "https://id.getharvest.com/developers" }], "tools": [{ "id": "list_accounts", "name": "List Accounts", "description": "List all Harvest accounts the authenticated user can access. Call this first to get your Harvest-Account-Id for subsequent API calls.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://id.getharvest.com/api/v2/accounts", "response": { "transform": "accounts" } } }, { "id": "get_current_user", "name": "Get Current User", "description": "Get the authenticated user's Harvest profile (id, name, email, timezone, roles)", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/users/me", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true } } } }, { "id": "list_users", "name": "List Users", "description": "List all active users in the Harvest account", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/users", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "is_active": { "type": "boolean", "in": "query", "description": "Filter by active status", "default": true }, "updated_since": { "type": "string", "in": "query", "description": "Only return users updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "users" } } }, { "id": "list_time_entries", "name": "List Time Entries", "description": "List time entries (timesheets). Filter by user, project, client, or date range.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/time_entries", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "user_id": { "type": "number", "in": "query", "description": "Filter by user ID" }, "client_id": { "type": "number", "in": "query", "description": "Filter by client ID" }, "project_id": { "type": "number", "in": "query", "description": "Filter by project ID" }, "task_id": { "type": "number", "in": "query", "description": "Filter by task ID" }, "is_running": { "type": "boolean", "in": "query", "description": "Filter to only currently running timers" }, "is_billed": { "type": "boolean", "in": "query", "description": "Filter by billed status" }, "from": { "type": "string", "in": "query", "description": "Start date (YYYY-MM-DD). Return entries with spent_date >= from." }, "to": { "type": "string", "in": "query", "description": "End date (YYYY-MM-DD). Return entries with spent_date <= to." }, "updated_since": { "type": "string", "in": "query", "description": "Only return entries updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "time_entries" } } }, { "id": "get_time_entry", "name": "Get Time Entry", "description": "Get details of a specific time entry by ID", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/time_entries/{timeEntryId}", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "timeEntryId": { "type": "number", "in": "path", "description": "Harvest time entry ID", "required": true } } } }, { "id": "create_time_entry", "name": "Create Time Entry", "description": "Create a new time entry (timesheet). Provide either hours or start/end times.", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://api.harvestapp.com/v2/time_entries", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true } }, "body": { "project_id": { "type": "number", "description": "Harvest project ID", "required": true }, "task_id": { "type": "number", "description": "Harvest task ID", "required": true }, "spent_date": { "type": "string", "description": "Date of the time entry (YYYY-MM-DD)", "required": true }, "user_id": { "type": "number", "description": "User ID to log time for (defaults to authenticated user)" }, "hours": { "type": "number", "description": "Hours to log (e.g. 1.5). Use instead of started_time/ended_time." }, "started_time": { "type": "string", "description": "Start time (hh:mmam/pm, e.g. 8:00am). Use with ended_time instead of hours." }, "ended_time": { "type": "string", "description": "End time (hh:mmam/pm, e.g. 5:30pm). Use with started_time instead of hours." }, "notes": { "type": "string", "description": "Notes about the time entry" }, "external_reference": { "type": "object", "description": "External reference object with id, group_id, account_id, permalink" } } } }, { "id": "update_time_entry", "name": "Update Time Entry", "description": "Update an existing time entry", "requiresWrite": true, "endpoint": { "method": "PATCH", "url": "https://api.harvestapp.com/v2/time_entries/{timeEntryId}", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "timeEntryId": { "type": "number", "in": "path", "description": "Harvest time entry ID", "required": true } }, "body": { "project_id": { "type": "number", "description": "Updated project ID" }, "task_id": { "type": "number", "description": "Updated task ID" }, "spent_date": { "type": "string", "description": "Updated date (YYYY-MM-DD)" }, "hours": { "type": "number", "description": "Updated hours" }, "started_time": { "type": "string", "description": "Updated start time (hh:mmam/pm)" }, "ended_time": { "type": "string", "description": "Updated end time (hh:mmam/pm)" }, "notes": { "type": "string", "description": "Updated notes" }, "is_locked": { "type": "boolean", "description": "Lock/unlock the time entry" } } } }, { "id": "delete_time_entry", "name": "Delete Time Entry", "description": "Delete a time entry. Only unlocked, non-billed entries can be deleted.", "requiresWrite": true, "endpoint": { "method": "DELETE", "url": "https://api.harvestapp.com/v2/time_entries/{timeEntryId}", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "timeEntryId": { "type": "number", "in": "path", "description": "Harvest time entry ID", "required": true } } } }, { "id": "stop_timer", "name": "Stop Timer", "description": "Stop a running timer for a time entry", "requiresWrite": true, "endpoint": { "method": "PATCH", "url": "https://api.harvestapp.com/v2/time_entries/{timeEntryId}/stop", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "timeEntryId": { "type": "number", "in": "path", "description": "Harvest time entry ID of the running timer", "required": true } } } }, { "id": "restart_timer", "name": "Restart Timer", "description": "Restart a stopped timer for a time entry", "requiresWrite": true, "endpoint": { "method": "PATCH", "url": "https://api.harvestapp.com/v2/time_entries/{timeEntryId}/restart", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "timeEntryId": { "type": "number", "in": "path", "description": "Harvest time entry ID", "required": true } } } }, { "id": "list_projects", "name": "List Projects", "description": "List all projects in the Harvest account", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/projects", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "is_active": { "type": "boolean", "in": "query", "description": "Filter by active status" }, "client_id": { "type": "number", "in": "query", "description": "Filter by client ID" }, "updated_since": { "type": "string", "in": "query", "description": "Only return projects updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "projects" } } }, { "id": "get_project", "name": "Get Project", "description": "Get details of a specific project", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/projects/{projectId}", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "projectId": { "type": "number", "in": "path", "description": "Harvest project ID", "required": true } } } }, { "id": "list_tasks", "name": "List Tasks", "description": "List all tasks available in the Harvest account", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/tasks", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "is_active": { "type": "boolean", "in": "query", "description": "Filter by active status" }, "updated_since": { "type": "string", "in": "query", "description": "Only return tasks updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "tasks" } } }, { "id": "list_project_task_assignments", "name": "List Project Task Assignments", "description": "List all task assignments for a specific project (tasks billable to this project)", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/projects/{projectId}/task_assignments", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "projectId": { "type": "number", "in": "path", "description": "Harvest project ID", "required": true }, "is_active": { "type": "boolean", "in": "query", "description": "Filter by active status" }, "updated_since": { "type": "string", "in": "query", "description": "Only return task assignments updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "task_assignments" } } }, { "id": "list_clients", "name": "List Clients", "description": "List all clients in the Harvest account", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/clients", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "is_active": { "type": "boolean", "in": "query", "description": "Filter by active status" }, "updated_since": { "type": "string", "in": "query", "description": "Only return clients updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "clients" } } }, { "id": "get_client", "name": "Get Client", "description": "Get details of a specific client", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/clients/{clientId}", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "clientId": { "type": "number", "in": "path", "description": "Harvest client ID", "required": true } } } }, { "id": "list_invoices", "name": "List Invoices", "description": "List all invoices. Filter by client, status, or date range.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/invoices", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "client_id": { "type": "number", "in": "query", "description": "Filter by client ID" }, "project_id": { "type": "number", "in": "query", "description": "Filter by project ID" }, "state": { "type": "string", "in": "query", "description": "Filter by state: draft, open, paid, closed" }, "from": { "type": "string", "in": "query", "description": "Only invoices with issue_date >= from (YYYY-MM-DD)" }, "to": { "type": "string", "in": "query", "description": "Only invoices with issue_date <= to (YYYY-MM-DD)" }, "updated_since": { "type": "string", "in": "query", "description": "Only return invoices updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "invoices" } } }, { "id": "get_invoice", "name": "Get Invoice", "description": "Get details of a specific invoice including line items", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/invoices/{invoiceId}", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "invoiceId": { "type": "number", "in": "path", "description": "Harvest invoice ID", "required": true } } } }, { "id": "create_invoice", "name": "Create Invoice", "description": "Create a new invoice for a client", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://api.harvestapp.com/v2/invoices", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true } }, "body": { "client_id": { "type": "number", "description": "Client ID to invoice", "required": true }, "subject": { "type": "string", "description": "Invoice subject line" }, "notes": { "type": "string", "description": "Invoice notes visible to client" }, "issue_date": { "type": "string", "description": "Issue date (YYYY-MM-DD, defaults to today)" }, "due_date": { "type": "string", "description": "Due date (YYYY-MM-DD)" }, "currency": { "type": "string", "description": "Invoice currency code (e.g. USD, EUR). Defaults to account currency." }, "line_items_import": { "type": "object", "description": "Import time entries/expenses into line items: { project_ids: number[], time: { summary_type, from, to }, expenses: { summary_type, from, to, attach_receipt } }" }, "line_items": { "type": "array", "description": "Manual line items array: [{ kind, description, unit_price, quantity, taxed, taxed2 }]" } } } }, { "id": "update_invoice", "name": "Update Invoice", "description": "Update an existing invoice (subject, notes, dates, line items, state)", "requiresWrite": true, "endpoint": { "method": "PATCH", "url": "https://api.harvestapp.com/v2/invoices/{invoiceId}", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "invoiceId": { "type": "number", "in": "path", "description": "Harvest invoice ID", "required": true } }, "body": { "subject": { "type": "string", "description": "Updated subject" }, "notes": { "type": "string", "description": "Updated notes" }, "issue_date": { "type": "string", "description": "Updated issue date (YYYY-MM-DD)" }, "due_date": { "type": "string", "description": "Updated due date (YYYY-MM-DD)" }, "line_items": { "type": "array", "description": "Updated line items" } } } }, { "id": "list_invoice_payments", "name": "List Invoice Payments", "description": "List all payments recorded for an invoice", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/invoices/{invoiceId}/payments", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "invoiceId": { "type": "number", "in": "path", "description": "Harvest invoice ID", "required": true }, "updated_since": { "type": "string", "in": "query", "description": "Only return payments updated after this ISO 8601 datetime" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "invoice_payments" } } }, { "id": "create_invoice_payment", "name": "Create Invoice Payment", "description": "Record a payment for an invoice", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://api.harvestapp.com/v2/invoices/{invoiceId}/payments", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "invoiceId": { "type": "number", "in": "path", "description": "Harvest invoice ID", "required": true } }, "body": { "amount": { "type": "number", "description": "Payment amount", "required": true }, "paid_at": { "type": "string", "description": "Payment datetime (ISO 8601, defaults to now)" }, "paid_date": { "type": "string", "description": "Payment date (YYYY-MM-DD, use instead of paid_at for date-only)" }, "notes": { "type": "string", "description": "Payment notes" }, "send_thank_you": { "type": "boolean", "description": "Send a thank-you email to the client", "default": false } } } }, { "id": "time_report_by_project", "name": "Time Report by Project", "description": "Get a time report aggregated by project. Requires from and to date range.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/reports/time/projects", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "from": { "type": "string", "in": "query", "description": "Report start date (YYYY-MM-DD)", "required": true }, "to": { "type": "string", "in": "query", "description": "Report end date (YYYY-MM-DD)", "required": true }, "include_fixed_fee": { "type": "boolean", "in": "query", "description": "Include fixed-fee projects" }, "client_id": { "type": "number", "in": "query", "description": "Filter by client ID" }, "project_id": { "type": "number", "in": "query", "description": "Filter by project ID" }, "user_id": { "type": "number", "in": "query", "description": "Filter by user ID" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "results" } } }, { "id": "time_report_by_team", "name": "Time Report by Team", "description": "Get a time report aggregated by team member. Requires from and to date range.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/reports/time/team", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "from": { "type": "string", "in": "query", "description": "Report start date (YYYY-MM-DD)", "required": true }, "to": { "type": "string", "in": "query", "description": "Report end date (YYYY-MM-DD)", "required": true }, "client_id": { "type": "number", "in": "query", "description": "Filter by client ID" }, "project_id": { "type": "number", "in": "query", "description": "Filter by project ID" }, "user_id": { "type": "number", "in": "query", "description": "Filter by user ID" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "results" } } }, { "id": "time_report_by_client", "name": "Time Report by Client", "description": "Get a time report aggregated by client. Requires from and to date range.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/reports/time/clients", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "from": { "type": "string", "in": "query", "description": "Report start date (YYYY-MM-DD)", "required": true }, "to": { "type": "string", "in": "query", "description": "Report end date (YYYY-MM-DD)", "required": true }, "client_id": { "type": "number", "in": "query", "description": "Filter by client ID" }, "project_id": { "type": "number", "in": "query", "description": "Filter by project ID" }, "user_id": { "type": "number", "in": "query", "description": "Filter by user ID" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "results" } } }, { "id": "time_report_by_task", "name": "Time Report by Task", "description": "Get a time report aggregated by task. Requires from and to date range.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/reports/time/tasks", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "from": { "type": "string", "in": "query", "description": "Report start date (YYYY-MM-DD)", "required": true }, "to": { "type": "string", "in": "query", "description": "Report end date (YYYY-MM-DD)", "required": true }, "client_id": { "type": "number", "in": "query", "description": "Filter by client ID" }, "project_id": { "type": "number", "in": "query", "description": "Filter by project ID" }, "user_id": { "type": "number", "in": "query", "description": "Filter by user ID" }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "results" } } }, { "id": "invoice_report", "name": "Invoice Report", "description": "Get an invoiced time and expenses report. Requires from and to date range.", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.harvestapp.com/v2/reports/invoices/invoiced", "params": { "Harvest-Account-Id": { "type": "string", "in": "header", "description": "Harvest Account ID (get it from list_accounts)", "required": true }, "from": { "type": "string", "in": "query", "description": "Report start date (YYYY-MM-DD)", "required": true }, "to": { "type": "string", "in": "query", "description": "Report end date (YYYY-MM-DD)", "required": true }, "page": { "type": "number", "in": "query", "description": "Page number", "default": 1 }, "per_page": { "type": "number", "in": "query", "description": "Results per page (max 100)", "default": 50 } }, "response": { "transform": "results" } } }], "prompts": [{ "id": "log_time", "title": "Log time for today", "prompt": "Log time entries for today. Show me my projects and tasks, then create time entries for the work I describe.", "category": "productivity", "icon": "clock" }, { "id": "weekly_timesheet", "title": "Show weekly timesheet", "prompt": "Show me my time entries for this week grouped by project. Calculate total hours per project and overall.", "category": "productivity", "icon": "calendar" }, { "id": "create_invoice", "title": "Create an invoice", "prompt": "Create a new invoice for a client. Import tracked time entries for the specified period and generate the invoice.", "category": "finance", "icon": "file-text" }, { "id": "invoice_status", "title": "Check invoice status", "prompt": "Show me all open invoices with their amounts, due dates, and payment status. Flag any overdue invoices.", "category": "finance", "icon": "alert-circle" }, { "id": "team_report", "title": "Team time report", "prompt": "Generate a time report for the team this month. Show hours logged per person, per project, and identify anyone who hasn't logged time.", "category": "management", "icon": "users" }], "suggestedWith": ["github", "jira", "slack"] },
|
|
16
16
|
{ "name": "jira", "displayName": "Jira", "icon": "jira.svg", "description": "Search, create, and manage Jira issues and projects", "auth": { "type": "oauth2", "provider": "atlassian", "authorizationUrl": "https://auth.atlassian.com/authorize", "tokenUrl": "https://auth.atlassian.com/oauth/token", "scopes": ["read:jira-work", "write:jira-work", "read:jira-user", "offline_access"], "tokenAuthMethod": "body", "requiredApis": [{ "name": "Atlassian OAuth 2.0", "enableUrl": "https://developer.atlassian.com/console/myapps/" }], "additionalAuthParams": { "audience": "api.atlassian.com", "prompt": "consent" } }, "envVars": [{ "name": "ATLASSIAN_CLIENT_ID", "description": "Atlassian OAuth 2.0 Client ID (from your app)", "required": true, "sensitive": false, "docsUrl": "https://developer.atlassian.com/console/myapps/" }, { "name": "ATLASSIAN_CLIENT_SECRET", "description": "Atlassian OAuth 2.0 Client Secret", "required": true, "sensitive": true, "docsUrl": "https://developer.atlassian.com/console/myapps/" }], "tools": [{ "id": "list_sites", "name": "List Atlassian Sites", "description": "List Atlassian cloud sites/resources the OAuth token can access; use the returned id as cloudId for Jira and Confluence tools", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.atlassian.com/oauth/token/accessible-resources", "response": { "transform": "" } } }, { "id": "list_projects", "name": "List Projects", "description": "List all accessible Jira projects", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.atlassian.com/ex/jira/{cloudId}/rest/api/3/project/search", "params": { "cloudId": { "type": "string", "in": "path", "description": "Atlassian cloud ID from accessible-resources", "required": true }, "query": { "type": "string", "in": "query", "description": "Search text for project name or key" }, "maxResults": { "type": "number", "in": "query", "description": "Maximum projects to return", "default": 50 }, "startAt": { "type": "number", "in": "query", "description": "Pagination offset", "default": 0 } }, "response": { "transform": "values" } } }, { "id": "get_project", "name": "Get Project", "description": "Get detailed information about a Jira project", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.atlassian.com/ex/jira/{cloudId}/rest/api/3/project/{projectIdOrKey}", "params": { "cloudId": { "type": "string", "in": "path", "description": "Atlassian cloud ID from OAuth accessible resources", "required": true }, "projectIdOrKey": { "type": "string", "in": "path", "description": "Jira project ID or key", "required": true } } } }, { "id": "search_issues", "name": "Search Issues", "description": "Search Jira issues using JQL (Jira Query Language)", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.atlassian.com/ex/jira/{cloudId}/rest/api/3/search/jql", "params": { "cloudId": { "type": "string", "in": "path", "description": "Atlassian cloud ID from accessible-resources", "required": true }, "jql": { "type": "string", "in": "query", "description": "Jira Query Language search expression", "required": true }, "maxResults": { "type": "number", "in": "query", "description": "Maximum issues to return", "default": 50 }, "nextPageToken": { "type": "string", "in": "query", "description": "Pagination token from the previous Jira JQL search response" }, "fields": { "type": "array", "in": "query", "description": "Issue fields to include" } }, "response": { "transform": "issues" } } }, { "id": "get_issue", "name": "Get Issue", "description": "Get detailed information about a specific Jira issue", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.atlassian.com/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}", "params": { "cloudId": { "type": "string", "in": "path", "description": "Atlassian cloud ID from accessible-resources", "required": true }, "issueIdOrKey": { "type": "string", "in": "path", "description": "Jira issue ID or key", "required": true }, "fields": { "type": "string", "in": "query", "description": "Comma-separated issue fields to include" } } } }, { "id": "create_issue", "name": "Create Issue", "description": "Create a new Jira issue in a project", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://api.atlassian.com/ex/jira/{cloudId}/rest/api/3/issue", "params": { "cloudId": { "type": "string", "in": "path", "description": "Atlassian cloud ID from accessible-resources", "required": true } }, "body": { "fields": { "type": "object", "description": "Jira issue fields including project, issuetype, summary, and description", "required": true } } } }, { "id": "update_issue", "name": "Update Issue", "description": "Update an existing Jira issue (status, fields, etc.)", "requiresWrite": true, "endpoint": { "method": "PUT", "url": "https://api.atlassian.com/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}", "params": { "cloudId": { "type": "string", "in": "path", "description": "Atlassian cloud ID from accessible-resources", "required": true }, "issueIdOrKey": { "type": "string", "in": "path", "description": "Jira issue ID or key", "required": true } }, "body": { "fields": { "type": "object", "description": "Jira fields to set" }, "update": { "type": "object", "description": "Jira update operations" } } } }, { "id": "list_comments", "name": "List Comments", "description": "List comments on a Jira issue", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.atlassian.com/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}/comment", "params": { "cloudId": { "type": "string", "in": "path", "description": "Atlassian cloud ID from OAuth accessible resources", "required": true }, "issueIdOrKey": { "type": "string", "in": "path", "description": "Jira issue ID or key", "required": true }, "startAt": { "type": "number", "in": "query", "description": "Pagination offset", "default": 0 }, "maxResults": { "type": "number", "in": "query", "description": "Maximum comments to return", "default": 50 } } } }, { "id": "add_comment", "name": "Add Comment", "description": "Add a comment to a Jira issue", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://api.atlassian.com/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}/comment", "params": { "cloudId": { "type": "string", "in": "path", "description": "Atlassian cloud ID from OAuth accessible resources", "required": true }, "issueIdOrKey": { "type": "string", "in": "path", "description": "Jira issue ID or key", "required": true } }, "body": { "body": { "type": "object", "description": "Comment body in Atlassian Document Format", "required": true } } } }, { "id": "get_transitions", "name": "Get Transitions", "description": "List available workflow transitions for a Jira issue", "requiresWrite": false, "endpoint": { "method": "GET", "url": "https://api.atlassian.com/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}/transitions", "params": { "cloudId": { "type": "string", "in": "path", "description": "Atlassian cloud ID from OAuth accessible resources", "required": true }, "issueIdOrKey": { "type": "string", "in": "path", "description": "Jira issue ID or key", "required": true } } } }, { "id": "transition_issue", "name": "Transition Issue", "description": "Move a Jira issue to a new workflow status. First call get_transitions to get valid transition IDs, then pass the ID here.", "requiresWrite": true, "endpoint": { "method": "POST", "url": "https://api.atlassian.com/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}/transitions", "params": { "cloudId": { "type": "string", "in": "path", "description": "Atlassian cloud ID from OAuth accessible resources", "required": true }, "issueIdOrKey": { "type": "string", "in": "path", "description": "Jira issue ID or key", "required": true } }, "body": { "transition": { "type": "object", "description": "Transition object with id field, e.g. {\"id\": \"21\"}", "required": true }, "fields": { "type": "object", "description": "Optional field updates to apply during the transition" }, "comment": { "type": "object", "description": "Optional comment in Atlassian Document Format to add with the transition" } } } }], "prompts": [{ "id": "find_bugs", "title": "Find open bugs", "prompt": "Search for all open bugs assigned to me or in my current sprint.", "category": "productivity", "icon": "bug" }, { "id": "create_task", "title": "Create a task", "prompt": "Create a new task in Jira with a title, description, and priority.", "category": "productivity", "icon": "plus" }, { "id": "sprint_summary", "title": "Sprint summary", "prompt": "Get a summary of all issues in the current sprint, organized by status.", "category": "productivity", "icon": "list" }, { "id": "update_status", "title": "Update issue status", "prompt": "Move an issue to a different status (To Do, In Progress, Done, etc.).", "category": "productivity", "icon": "check" }], "suggestedWith": ["github", "slack", "confluence"] },
|
|
17
17
|
{ "name": "linear", "displayName": "Linear", "icon": "linear.svg", "description": "Search, create, and manage Linear issues and projects", "auth": { "type": "oauth2", "provider": "linear", "authorizationUrl": "https://linear.app/oauth/authorize", "tokenUrl": "https://api.linear.app/oauth/token", "scopes": ["read", "write"], "tokenAuthMethod": "basic", "requiredApis": [{ "name": "Linear OAuth Application", "enableUrl": "https://linear.app/settings/api" }] }, "envVars": [{ "name": "LINEAR_CLIENT_ID", "description": "Linear OAuth Client ID (from your OAuth application)", "required": true, "sensitive": false, "docsUrl": "https://linear.app/settings/api" }, { "name": "LINEAR_CLIENT_SECRET", "description": "Linear OAuth Client Secret", "required": true, "sensitive": true, "docsUrl": "https://linear.app/settings/api" }], "tools": [{ "id": "search_issues", "name": "Search Issues", "description": "Search for Linear issues by title or description", "requiresWrite": false, "endpoint": { "type": "graphql", "method": "POST", "url": "https://api.linear.app/graphql", "query": "query($query: String!, $first: Int) { searchIssues(term: $query, first: $first) { nodes { id identifier title description state { name } assignee { name } priority priorityLabel createdAt updatedAt } } }", "params": { "query": { "type": "string", "in": "body", "description": "Search query text", "required": true }, "first": { "type": "number", "in": "body", "description": "Max results", "default": 20 } }, "response": { "transform": "searchIssues" } } }, { "id": "get_issue", "name": "Get Issue", "description": "Get detailed information about a specific Linear issue", "requiresWrite": false, "endpoint": { "type": "graphql", "method": "POST", "url": "https://api.linear.app/graphql", "query": "query($id: String!) { issue(id: $id) { id identifier title description state { name } assignee { name email } priority priorityLabel team { name } project { name } labels { nodes { name } } comments { nodes { body user { name } createdAt } } createdAt updatedAt } }", "params": { "id": { "type": "string", "in": "body", "description": "Issue ID or identifier (e.g. ENG-123)", "required": true } }, "response": { "transform": "issue" } } }, { "id": "create_issue", "name": "Create Issue", "description": "Create a new Linear issue in a team", "requiresWrite": true, "endpoint": { "type": "graphql", "method": "POST", "url": "https://api.linear.app/graphql", "query": "mutation($teamId: String!, $title: String!, $description: String, $priority: Int) { issueCreate(input: { teamId: $teamId, title: $title, description: $description, priority: $priority }) { success issue { id identifier title url } } }", "params": { "teamId": { "type": "string", "in": "body", "description": "Team ID", "required": true }, "title": { "type": "string", "in": "body", "description": "Issue title", "required": true }, "description": { "type": "string", "in": "body", "description": "Issue description (markdown)" }, "priority": { "type": "number", "in": "body", "description": "Priority (0=none, 1=urgent, 2=high, 3=medium, 4=low)" } }, "response": { "transform": "issueCreate" } } }, { "id": "update_issue", "name": "Update Issue", "description": "Update the status, assignee, or other properties of an issue", "requiresWrite": true, "endpoint": { "type": "graphql", "method": "POST", "url": "https://api.linear.app/graphql", "query": "mutation($id: String!, $stateId: String, $assigneeId: String, $priority: Int) { issueUpdate(id: $id, input: { stateId: $stateId, assigneeId: $assigneeId, priority: $priority }) { success issue { id identifier title state { name } assignee { name } } } }", "params": { "id": { "type": "string", "in": "body", "description": "Issue ID", "required": true }, "stateId": { "type": "string", "in": "body", "description": "New state ID" }, "assigneeId": { "type": "string", "in": "body", "description": "New assignee user ID" }, "priority": { "type": "number", "in": "body", "description": "New priority" } }, "response": { "transform": "issueUpdate" } } }, { "id": "delete_issue", "name": "Delete Issue", "description": "Archive a Linear issue. By default this is non-permanent so canary-created issues do not remain active.", "requiresWrite": true, "endpoint": { "type": "graphql", "method": "POST", "url": "https://api.linear.app/graphql", "query": "mutation($id: String!, $permanentlyDelete: Boolean) { issueDelete(id: $id, permanentlyDelete: $permanentlyDelete) { success } }", "params": { "id": { "type": "string", "in": "body", "description": "Issue ID", "required": true }, "permanentlyDelete": { "type": "boolean", "in": "body", "description": "Whether to permanently delete the issue. Defaults to false (archive).", "default": false } }, "response": { "transform": "issueDelete" } } }, { "id": "list_projects", "name": "List Projects", "description": "List all projects in the workspace", "requiresWrite": false, "endpoint": { "type": "graphql", "method": "POST", "url": "https://api.linear.app/graphql", "query": "query($first: Int) { projects(first: $first) { nodes { id name description state startDate targetDate lead { name } teams { nodes { name } } } } }", "params": { "first": { "type": "number", "in": "body", "description": "Max results", "default": 50 } }, "response": { "transform": "projects" } } }, { "id": "list_teams", "name": "List Teams", "description": "List Linear teams in the workspace so issues can be created in the right team", "requiresWrite": false, "endpoint": { "type": "graphql", "method": "POST", "url": "https://api.linear.app/graphql", "query": "query($first: Int) { teams(first: $first) { nodes { id name key description private issueCount createdAt updatedAt } } }", "params": { "first": { "type": "number", "in": "body", "description": "Max results", "default": 50 } }, "response": { "transform": "teams" } } }, { "id": "list_workflow_states", "name": "List Workflow States", "description": "List workflow states for a Linear team so issues can be moved to the right status", "requiresWrite": false, "endpoint": { "type": "graphql", "method": "POST", "url": "https://api.linear.app/graphql", "query": "query($teamId: String!) { team(id: $teamId) { id name states { nodes { id name type color position } } } }", "params": { "teamId": { "type": "string", "in": "body", "description": "Team ID", "required": true } }, "response": { "transform": "team.states" } } }, { "id": "list_users", "name": "List Users", "description": "List Linear users in the workspace so issues can be assigned to the right person", "requiresWrite": false, "endpoint": { "type": "graphql", "method": "POST", "url": "https://api.linear.app/graphql", "query": "query($first: Int) { users(first: $first) { nodes { id name displayName email active avatarUrl } } }", "params": { "first": { "type": "number", "in": "body", "description": "Max results", "default": 50 } }, "response": { "transform": "users" } } }, { "id": "add_comment", "name": "Add Comment", "description": "Add a comment to a Linear issue", "requiresWrite": true, "endpoint": { "type": "graphql", "method": "POST", "url": "https://api.linear.app/graphql", "query": "mutation($issueId: String!, $body: String!) { commentCreate(input: { issueId: $issueId, body: $body }) { success comment { id body createdAt user { id name } issue { id identifier title } } } }", "params": { "issueId": { "type": "string", "in": "body", "description": "Issue ID", "required": true }, "body": { "type": "string", "in": "body", "description": "Comment body in markdown", "required": true } }, "response": { "transform": "commentCreate" } } }], "prompts": [{ "id": "find_issues", "title": "Find my issues", "prompt": "Search for Linear issues assigned to me or related to a specific topic.", "category": "productivity", "icon": "search" }, { "id": "create_bug_report", "title": "Create bug report", "prompt": "Create a new bug report in Linear with title, description, and relevant labels.", "category": "productivity", "icon": "plus" }, { "id": "update_issue_status", "title": "Update issue status", "prompt": "Update the status of a Linear issue (e.g., mark as done, in progress, blocked).", "category": "productivity", "icon": "check" }, { "id": "project_overview", "title": "Project overview", "prompt": "Get an overview of all projects in Linear, including their status and key issues.", "category": "productivity", "icon": "list" }], "suggestedWith": ["github", "slack", "figma"] },
|
|
18
18
|
{ "name": "mixpanel", "displayName": "Mixpanel", "icon": "mixpanel.svg", "description": "Track events, analyze funnels, and understand user behavior with Mixpanel analytics", "auth": { "type": "api-key", "requiredApis": [{ "name": "Mixpanel API", "enableUrl": "https://mixpanel.com/settings/project" }], "keyName": "MIXPANEL_PROJECT_TOKEN" }, "envVars": [{ "name": "MIXPANEL_PROJECT_TOKEN", "description": "Mixpanel Project Token for event tracking", "required": true, "sensitive": true, "docsUrl": "https://docs.mixpanel.com/docs/tracking-methods/id-management/authentication" }, { "name": "MIXPANEL_API_SECRET", "description": "Mixpanel API Secret for data export and query operations", "required": true, "sensitive": true, "docsUrl": "https://developer.mixpanel.com/reference/authentication" }, { "name": "MIXPANEL_PROJECT_ID", "description": "Mixpanel Project ID (found in project settings)", "required": true, "sensitive": false, "docsUrl": "https://docs.mixpanel.com/docs/admin/organizations-projects/manage-projects" }], "tools": [{ "id": "track_event", "name": "Track Event", "description": "Track a custom event in Mixpanel with properties", "requiresWrite": true }, { "id": "query_events", "name": "Query Events", "description": "Query and export event data from Mixpanel", "requiresWrite": false }, { "id": "get_funnel", "name": "Get Funnel", "description": "Retrieve funnel analysis data to understand conversion rates", "requiresWrite": false }, { "id": "get_retention", "name": "Get Retention", "description": "Analyze user retention cohorts over time", "requiresWrite": false }, { "id": "list_cohorts", "name": "List Cohorts", "description": "List all user cohorts defined in your Mixpanel project", "requiresWrite": false }], "prompts": [{ "id": "event_analysis", "title": "Event analysis", "prompt": "Show me the most important events tracked in my Mixpanel project over the last 7 days and their trends.", "category": "analytics", "icon": "chart" }, { "id": "funnel_performance", "title": "Funnel performance", "prompt": "Analyze my key conversion funnels and identify where users are dropping off.", "category": "analytics", "icon": "funnel" }, { "id": "retention_insights", "title": "Retention insights", "prompt": "Give me insights about user retention and cohort behavior over the past month.", "category": "analytics", "icon": "users" }], "suggestedWith": ["slack", "analytics", "monitoring"] },
|