Compare commits

...

23 Commits

Author SHA1 Message Date
waleed
0603101d75 fix(mcp): correct event handler type for onInput 2026-01-28 00:59:23 -08:00
waleed
c4d0fc31cc fix: move generic to function parameter position 2026-01-28 00:57:53 -08:00
waleed
19bc4afcc9 fix: correct filterBlocks type signature 2026-01-28 00:30:52 -08:00
waleed
6901b15260 fix: include keywords in search filter + show service name in tool operations 2026-01-28 00:24:55 -08:00
waleed
fe72c69d44 fix: allow search data re-initialization when permissions change 2026-01-27 23:53:05 -08:00
waleed
1709e1f81f chore: add devtools middleware to search modal store 2026-01-27 23:52:31 -08:00
waleed
e02c156d75 chore: remove comments 2026-01-27 23:44:34 -08:00
waleed
9506fea20d chore: remove unrelated workflow.tsx changes 2026-01-27 23:43:53 -08:00
waleed
6494f614b4 improvement(cmdk): refactor search modal to use cmdk + fix icon SVG IDs 2026-01-27 23:42:43 -08:00
Vikhyath Mondreti
c8ffda1616 fix(gemini): token count (#3039)
* fix(gemini): token count

* fix to include tool call tokens
2026-01-27 19:16:54 -08:00
Waleed
b4a389a71f improvement(helm): update GPU device plugin and add cert-manager issuers (#3036)
* improvement(helm): update GPU device plugin and add cert-manager issuers

* fix(helm): address code review feedback for GPU plugin and cert-manager

* fix(helm): remove duplicate nodeSelector, add hook for CA issuer ordering

* fix(helm): remove incorrect hook, CA issuer auto-reconciles
2026-01-27 18:25:08 -08:00
Vikhyath Mondreti
65bc21608c improvement(block-inputs): must parse json accurately + models max_tokens fix (#3033)
* improvement(block-inputs): must parse json accurately

* fix sheets typing

* add reference comment

* fix models

* revert blocks changes

* fix param to follow openai new convention
2026-01-27 18:17:35 -08:00
Waleed
ef613ef035 fix(models): update cerebras and groq models (#3038) 2026-01-27 18:12:48 -08:00
Waleed
20b76e67b3 improvement(skills): extend skills (#3035) 2026-01-27 17:58:58 -08:00
Waleed
7640fdf742 feat(autolayout): add snap-to-grid support (#3031)
* feat(autolayout): add snap-to-grid support

* fix(autolayout): recalculate dimensions after grid snapping

* fix(autolayout): correct dimension calculation and propagate gridSize
2026-01-27 17:02:27 -08:00
Waleed
bca355c36d feat(tools): added clerk tools and block (#3032)
* feat(tools): added clerk tools and block

* updated docs gen script

* use clerk api types
2026-01-27 16:45:48 -08:00
Vikhyath Mondreti
089427822e fix(hitl): add missing fields to block configs (#3027)
* fix(hitl): add missing fields to block configs

* update copilot paths

* one more case

* update helper usage
2026-01-27 14:35:37 -08:00
Waleed
6b412c578d fix(security): add authentication to remaining tool API routes (#3028)
* fix(security): add authentication to tool API routes

* fix(drive): use checkSessionOrInternalAuth to allow browser access

* fix(selectors): use checkSessionOrInternalAuth for UI-accessible routes
2026-01-27 12:37:03 -08:00
Waleed
dddd0c8277 fix(workflow): use panel-aware viewport center for paste and block placement (#3024) 2026-01-27 12:36:38 -08:00
Waleed
be7f3db059 fix(badge): add type variant for dark mode contrast (#3025)
* fix(badge): add type variant for dark mode contrast

* docs(badge): add type variant to TSDoc
2026-01-27 11:40:14 -08:00
Waleed
416c08267a fix(terminal): persist collapsed state across page refresh (#3023)
* fix(terminal): persist collapsed state across page refresh

* fix(terminal): add activeWorkflowId to auto-open effect deps
2026-01-27 11:38:44 -08:00
Waleed
46ba315701 feat(tools): added more intercom tools (#3022) 2026-01-26 21:41:44 -08:00
Waleed
077e702dd8 improvement(tools): updated kalshi and polymarket tools and blocks (#3021) 2026-01-26 21:01:33 -08:00
270 changed files with 14886 additions and 4576 deletions

View File

@@ -55,21 +55,21 @@ export const {serviceName}{Action}Tool: ToolConfig<
}, },
params: { params: {
// Hidden params (system-injected) // Hidden params (system-injected, only use hidden for oauth accessToken)
accessToken: { accessToken: {
type: 'string', type: 'string',
required: true, required: true,
visibility: 'hidden', visibility: 'hidden',
description: 'OAuth access token', description: 'OAuth access token',
}, },
// User-only params (credentials, IDs user must provide) // User-only params (credentials, api key, IDs user must provide)
someId: { someId: {
type: 'string', type: 'string',
required: true, required: true,
visibility: 'user-only', visibility: 'user-only',
description: 'The ID of the resource', description: 'The ID of the resource',
}, },
// User-or-LLM params (can be provided by user OR computed by LLM) // User-or-LLM params (everything else, can be provided by user OR computed by LLM)
query: { query: {
type: 'string', type: 'string',
required: false, // Use false for optional required: false, // Use false for optional
@@ -114,8 +114,8 @@ export const {serviceName}{Action}Tool: ToolConfig<
### Visibility Options ### Visibility Options
- `'hidden'` - System-injected (OAuth tokens, internal params). User never sees. - `'hidden'` - System-injected (OAuth tokens, internal params). User never sees.
- `'user-only'` - User must provide (credentials, account-specific IDs) - `'user-only'` - User must provide (credentials, api keys, account-specific IDs)
- `'user-or-llm'` - User provides OR LLM can compute (search queries, content, filters) - `'user-or-llm'` - User provides OR LLM can compute (search queries, content, filters, most fall into this category)
### Parameter Types ### Parameter Types
- `'string'` - Text values - `'string'` - Text values

File diff suppressed because one or more lines are too long

View File

@@ -16,6 +16,7 @@ import {
CalendlyIcon, CalendlyIcon,
CirclebackIcon, CirclebackIcon,
ClayIcon, ClayIcon,
ClerkIcon,
ConfluenceIcon, ConfluenceIcon,
CursorIcon, CursorIcon,
DatadogIcon, DatadogIcon,
@@ -101,7 +102,6 @@ import {
ShopifyIcon, ShopifyIcon,
SlackIcon, SlackIcon,
SmtpIcon, SmtpIcon,
SpotifyIcon,
SQSIcon, SQSIcon,
SshIcon, SshIcon,
STTIcon, STTIcon,
@@ -144,6 +144,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
calendly: CalendlyIcon, calendly: CalendlyIcon,
circleback: CirclebackIcon, circleback: CirclebackIcon,
clay: ClayIcon, clay: ClayIcon,
clerk: ClerkIcon,
confluence_v2: ConfluenceIcon, confluence_v2: ConfluenceIcon,
cursor_v2: CursorIcon, cursor_v2: CursorIcon,
datadog: DatadogIcon, datadog: DatadogIcon,
@@ -182,7 +183,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
jina: JinaAIIcon, jina: JinaAIIcon,
jira: JiraIcon, jira: JiraIcon,
jira_service_management: JiraServiceManagementIcon, jira_service_management: JiraServiceManagementIcon,
kalshi: KalshiIcon, kalshi_v2: KalshiIcon,
knowledge: PackageSearchIcon, knowledge: PackageSearchIcon,
langsmith: LangsmithIcon, langsmith: LangsmithIcon,
lemlist: LemlistIcon, lemlist: LemlistIcon,
@@ -229,7 +230,6 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
shopify: ShopifyIcon, shopify: ShopifyIcon,
slack: SlackIcon, slack: SlackIcon,
smtp: SmtpIcon, smtp: SmtpIcon,
spotify: SpotifyIcon,
sqs: SQSIcon, sqs: SQSIcon,
ssh: SshIcon, ssh: SshIcon,
stagehand: StagehandIcon, stagehand: StagehandIcon,

View File

@@ -168,10 +168,10 @@ Search for tasks in an Asana workspace
| `success` | boolean | Operation success status | | `success` | boolean | Operation success status |
| `ts` | string | Timestamp of the response | | `ts` | string | Timestamp of the response |
| `tasks` | array | Array of matching tasks | | `tasks` | array | Array of matching tasks |
| ↳ `gid` | string | Assignee GID | | ↳ `gid` | string | Task GID |
| ↳ `resource_type` | string | Resource type | | ↳ `resource_type` | string | Resource type |
| ↳ `resource_subtype` | string | Resource subtype | | ↳ `resource_subtype` | string | Resource subtype |
| ↳ `name` | string | Assignee name | | ↳ `name` | string | Task name |
| ↳ `notes` | string | Task notes | | ↳ `notes` | string | Task notes |
| ↳ `completed` | boolean | Completion status | | ↳ `completed` | boolean | Completion status |
| ↳ `assignee` | object | Assignee details | | ↳ `assignee` | object | Assignee details |

View File

@@ -47,6 +47,7 @@ Runs a browser automation task using BrowserUse
| `save_browser_data` | boolean | No | Whether to save browser data | | `save_browser_data` | boolean | No | Whether to save browser data |
| `model` | string | No | LLM model to use \(default: gpt-4o\) | | `model` | string | No | LLM model to use \(default: gpt-4o\) |
| `apiKey` | string | Yes | API key for BrowserUse API | | `apiKey` | string | Yes | API key for BrowserUse API |
| `profile_id` | string | No | Browser profile ID for persistent sessions \(cookies, login state\) |
#### Output #### Output

View File

@@ -116,7 +116,7 @@ Get detailed information about a specific event type
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `resource` | object | Event type details | | `resource` | object | Event type details |
| ↳ `uri` | string | Canonical reference to the event type | | ↳ `uri` | string | Canonical reference to the event type |
| ↳ `name` | string | Question text | | ↳ `name` | string | Event type name |
| ↳ `active` | boolean | Whether the event type is active | | ↳ `active` | boolean | Whether the event type is active |
| ↳ `booking_method` | string | Booking method | | ↳ `booking_method` | string | Booking method |
| ↳ `color` | string | Hex color code | | ↳ `color` | string | Hex color code |
@@ -128,16 +128,12 @@ Get detailed information about a specific event type
| ↳ `enabled` | boolean | Whether question is enabled | | ↳ `enabled` | boolean | Whether question is enabled |
| ↳ `required` | boolean | Whether question is required | | ↳ `required` | boolean | Whether question is required |
| ↳ `answer_choices` | array | Available answer choices | | ↳ `answer_choices` | array | Available answer choices |
| ↳ `type` | string | Event type classification |
| ↳ `position` | number | Question order |
| ↳ `enabled` | boolean | Whether question is enabled |
| ↳ `required` | boolean | Whether question is required |
| ↳ `answer_choices` | array | Available answer choices |
| ↳ `description_html` | string | HTML formatted description | | ↳ `description_html` | string | HTML formatted description |
| ↳ `description_plain` | string | Plain text description | | ↳ `description_plain` | string | Plain text description |
| ↳ `duration` | number | Duration in minutes | | ↳ `duration` | number | Duration in minutes |
| ↳ `scheduling_url` | string | URL to scheduling page | | ↳ `scheduling_url` | string | URL to scheduling page |
| ↳ `slug` | string | Unique identifier for URLs | | ↳ `slug` | string | Unique identifier for URLs |
| ↳ `type` | string | Event type classification |
| ↳ `updated_at` | string | ISO timestamp of last update | | ↳ `updated_at` | string | ISO timestamp of last update |
### `calendly_list_scheduled_events` ### `calendly_list_scheduled_events`
@@ -170,16 +166,14 @@ Retrieve a list of scheduled events for a user or organization
| ↳ `start_time` | string | ISO timestamp of event start | | ↳ `start_time` | string | ISO timestamp of event start |
| ↳ `end_time` | string | ISO timestamp of event end | | ↳ `end_time` | string | ISO timestamp of event end |
| ↳ `event_type` | string | URI of the event type | | ↳ `event_type` | string | URI of the event type |
| ↳ `location` | string | Location description | | ↳ `location` | object | Event location details |
| ↳ `type` | string | Location type \(e.g., | | ↳ `type` | string | Location type \(e.g., |
| ↳ `location` | string | Location description |
| ↳ `join_url` | string | URL to join online meeting \(if applicable\) | | ↳ `join_url` | string | URL to join online meeting \(if applicable\) |
| ↳ `invitees_counter` | object | Invitee count information | | ↳ `invitees_counter` | object | Invitee count information |
| ↳ `total` | number | Total number of invitees | | ↳ `total` | number | Total number of invitees |
| ↳ `active` | number | Number of active invitees | | ↳ `active` | number | Number of active invitees |
| ↳ `limit` | number | Maximum number of invitees | | ↳ `limit` | number | Maximum number of invitees |
| ↳ `total` | number | Total number of invitees |
| ↳ `active` | number | Number of active invitees |
| ↳ `limit` | number | Maximum number of invitees |
| ↳ `created_at` | string | ISO timestamp of event creation | | ↳ `created_at` | string | ISO timestamp of event creation |
| ↳ `updated_at` | string | ISO timestamp of last update | | ↳ `updated_at` | string | ISO timestamp of last update |
| `pagination` | object | Pagination information | | `pagination` | object | Pagination information |
@@ -211,28 +205,22 @@ Get detailed information about a specific scheduled event
| ↳ `start_time` | string | ISO timestamp of event start | | ↳ `start_time` | string | ISO timestamp of event start |
| ↳ `end_time` | string | ISO timestamp of event end | | ↳ `end_time` | string | ISO timestamp of event end |
| ↳ `event_type` | string | URI of the event type | | ↳ `event_type` | string | URI of the event type |
| ↳ `location` | string | Location description | | ↳ `location` | object | Event location details |
| ↳ `type` | string | Location type | | ↳ `type` | string | Location type |
| ↳ `join_url` | string | URL to join online meeting | | ↳ `location` | string | Location description |
| ↳ `join_url` | string | URL to join online meeting |
| ↳ `invitees_counter` | object | Invitee count information | | ↳ `invitees_counter` | object | Invitee count information |
| ↳ `total` | number | Total number of invitees | | ↳ `total` | number | Total number of invitees |
| ↳ `active` | number | Number of active invitees | | ↳ `active` | number | Number of active invitees |
| ↳ `limit` | number | Maximum number of invitees | | ↳ `limit` | number | Maximum number of invitees |
| ↳ `total` | number | Total number of invitees |
| ↳ `active` | number | Number of active invitees |
| ↳ `limit` | number | Maximum number of invitees |
| ↳ `event_memberships` | array | Event hosts/members | | ↳ `event_memberships` | array | Event hosts/members |
| ↳ `user` | string | User URI | | ↳ `user` | string | User URI |
| ↳ `user_email` | string | User email | | ↳ `user_email` | string | User email |
| ↳ `user_name` | string | User name | | ↳ `user_name` | string | User name |
| ↳ `user` | string | User URI |
| ↳ `user_email` | string | User email |
| ↳ `user_name` | string | User name |
| ↳ `event_guests` | array | Additional guests | | ↳ `event_guests` | array | Additional guests |
| ↳ `email` | string | Guest email | | ↳ `email` | string | Guest email |
| ↳ `created_at` | string | When guest was added | | ↳ `created_at` | string | When guest was added |
| ↳ `updated_at` | string | When guest info was updated | | ↳ `updated_at` | string | When guest info was updated |
| ↳ `email` | string | Guest email |
| ↳ `created_at` | string | ISO timestamp of event creation | | ↳ `created_at` | string | ISO timestamp of event creation |
| ↳ `updated_at` | string | ISO timestamp of last update | | ↳ `updated_at` | string | ISO timestamp of last update |
@@ -267,9 +255,6 @@ Retrieve a list of invitees for a scheduled event
| ↳ `question` | string | Question text | | ↳ `question` | string | Question text |
| ↳ `answer` | string | Invitee answer | | ↳ `answer` | string | Invitee answer |
| ↳ `position` | number | Question order | | ↳ `position` | number | Question order |
| ↳ `question` | string | Question text |
| ↳ `answer` | string | Invitee answer |
| ↳ `position` | number | Question order |
| ↳ `timezone` | string | Invitee timezone | | ↳ `timezone` | string | Invitee timezone |
| ↳ `event` | string | URI of the scheduled event | | ↳ `event` | string | URI of the scheduled event |
| ↳ `created_at` | string | ISO timestamp when invitee was created | | ↳ `created_at` | string | ISO timestamp when invitee was created |

View File

@@ -0,0 +1,442 @@
---
title: Clerk
description: Manage users, organizations, and sessions in Clerk
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="clerk"
color="#131316"
/>
{/* MANUAL-CONTENT-START:intro */}
[Clerk](https://clerk.com/) is a comprehensive identity infrastructure platform that helps you manage users, authentication, and sessions for your applications.
In Sim, the Clerk integration lets your agents automate user and session management through easy-to-use API-based tools. Agents can securely list users, update user profiles, manage organizations, monitor sessions, and revoke access directly in your workflow.
With Clerk, you can:
- **Authenticate users and manage sessions**: Seamlessly control sign-in, sign-up, and session lifecycle for your users.
- **List and update users**: Automatically pull user lists, update user attributes, or view profile details as part of your agent tasks.
- **Manage organizations and memberships**: Add or update organizations and administer user memberships with clarity.
- **Monitor and revoke sessions**: See active or past user sessions, and revoke access immediately if needed for security.
The integration enables real-time, auditable management of your user base—all from within Sim. Connected agents can automate onboarding, enforce policies, keep directories up to date, and react to authentication events or organizational changes, helping you run secure and flexible processes using Clerk as your identity engine.
{/* MANUAL-CONTENT-END */}
## Usage Instructions
Integrate Clerk authentication and user management into your workflow. Create, update, delete, and list users. Manage organizations and their memberships. Monitor and control user sessions.
## Tools
### `clerk_list_users`
List all users in your Clerk application with optional filtering and pagination
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Yes | The Clerk Secret Key for API authentication |
| `limit` | number | No | Number of results per page \(1-500, default: 10\) |
| `offset` | number | No | Number of results to skip for pagination |
| `orderBy` | string | No | Sort field with optional +/- prefix for direction \(default: -created_at\) |
| `emailAddress` | string | No | Filter by email address \(comma-separated for multiple\) |
| `phoneNumber` | string | No | Filter by phone number \(comma-separated for multiple\) |
| `externalId` | string | No | Filter by external ID \(comma-separated for multiple\) |
| `username` | string | No | Filter by username \(comma-separated for multiple\) |
| `userId` | string | No | Filter by user ID \(comma-separated for multiple\) |
| `query` | string | No | Search query to match across email, phone, username, and names |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `users` | array | Array of Clerk user objects |
| ↳ `id` | string | User ID |
| ↳ `username` | string | Username |
| ↳ `firstName` | string | First name |
| ↳ `lastName` | string | Last name |
| ↳ `imageUrl` | string | Profile image URL |
| ↳ `hasImage` | boolean | Whether user has a profile image |
| ↳ `primaryEmailAddressId` | string | Primary email address ID |
| ↳ `primaryPhoneNumberId` | string | Primary phone number ID |
| ↳ `emailAddresses` | array | User email addresses |
| ↳ `id` | string | Email address ID |
| ↳ `emailAddress` | string | Email address |
| ↳ `phoneNumbers` | array | User phone numbers |
| ↳ `id` | string | Phone number ID |
| ↳ `phoneNumber` | string | Phone number |
| ↳ `externalId` | string | External system ID |
| ↳ `passwordEnabled` | boolean | Whether password is enabled |
| ↳ `twoFactorEnabled` | boolean | Whether 2FA is enabled |
| ↳ `banned` | boolean | Whether user is banned |
| ↳ `locked` | boolean | Whether user is locked |
| ↳ `lastSignInAt` | number | Last sign-in timestamp |
| ↳ `lastActiveAt` | number | Last activity timestamp |
| ↳ `createdAt` | number | Creation timestamp |
| ↳ `updatedAt` | number | Last update timestamp |
| ↳ `publicMetadata` | json | Public metadata |
| `totalCount` | number | Total number of users matching the query |
| `success` | boolean | Operation success status |
### `clerk_get_user`
Retrieve a single user by their ID from Clerk
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Yes | The Clerk Secret Key for API authentication |
| `userId` | string | Yes | The ID of the user to retrieve |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `id` | string | User ID |
| `username` | string | Username |
| `firstName` | string | First name |
| `lastName` | string | Last name |
| `imageUrl` | string | Profile image URL |
| `hasImage` | boolean | Whether user has a profile image |
| `primaryEmailAddressId` | string | Primary email address ID |
| `primaryPhoneNumberId` | string | Primary phone number ID |
| `primaryWeb3WalletId` | string | Primary Web3 wallet ID |
| `emailAddresses` | array | User email addresses |
| ↳ `id` | string | Email address ID |
| ↳ `emailAddress` | string | Email address |
| ↳ `verified` | boolean | Whether email is verified |
| `phoneNumbers` | array | User phone numbers |
| ↳ `id` | string | Phone number ID |
| ↳ `phoneNumber` | string | Phone number |
| ↳ `verified` | boolean | Whether phone is verified |
| `externalId` | string | External system ID |
| `passwordEnabled` | boolean | Whether password is enabled |
| `twoFactorEnabled` | boolean | Whether 2FA is enabled |
| `totpEnabled` | boolean | Whether TOTP is enabled |
| `backupCodeEnabled` | boolean | Whether backup codes are enabled |
| `banned` | boolean | Whether user is banned |
| `locked` | boolean | Whether user is locked |
| `deleteSelfEnabled` | boolean | Whether user can delete themselves |
| `createOrganizationEnabled` | boolean | Whether user can create organizations |
| `lastSignInAt` | number | Last sign-in timestamp |
| `lastActiveAt` | number | Last activity timestamp |
| `createdAt` | number | Creation timestamp |
| `updatedAt` | number | Last update timestamp |
| `publicMetadata` | json | Public metadata \(readable from frontend\) |
| `privateMetadata` | json | Private metadata \(backend only\) |
| `unsafeMetadata` | json | Unsafe metadata \(modifiable from frontend\) |
| `success` | boolean | Operation success status |
### `clerk_create_user`
Create a new user in your Clerk application
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Yes | The Clerk Secret Key for API authentication |
| `emailAddress` | string | No | Email addresses for the user \(comma-separated for multiple\) |
| `phoneNumber` | string | No | Phone numbers for the user \(comma-separated for multiple\) |
| `username` | string | No | Username for the user \(must be unique\) |
| `password` | string | No | Password for the user \(minimum 8 characters\) |
| `firstName` | string | No | First name of the user |
| `lastName` | string | No | Last name of the user |
| `externalId` | string | No | External system identifier \(must be unique\) |
| `publicMetadata` | json | No | Public metadata \(JSON object, readable from frontend\) |
| `privateMetadata` | json | No | Private metadata \(JSON object, backend only\) |
| `unsafeMetadata` | json | No | Unsafe metadata \(JSON object, modifiable from frontend\) |
| `skipPasswordChecks` | boolean | No | Skip password validation checks |
| `skipPasswordRequirement` | boolean | No | Make password optional |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `id` | string | Created user ID |
| `username` | string | Username |
| `firstName` | string | First name |
| `lastName` | string | Last name |
| `imageUrl` | string | Profile image URL |
| `primaryEmailAddressId` | string | Primary email address ID |
| `primaryPhoneNumberId` | string | Primary phone number ID |
| `emailAddresses` | array | User email addresses |
| ↳ `id` | string | Email address ID |
| ↳ `emailAddress` | string | Email address |
| ↳ `verified` | boolean | Whether email is verified |
| `phoneNumbers` | array | User phone numbers |
| ↳ `id` | string | Phone number ID |
| ↳ `phoneNumber` | string | Phone number |
| ↳ `verified` | boolean | Whether phone is verified |
| `externalId` | string | External system ID |
| `createdAt` | number | Creation timestamp |
| `updatedAt` | number | Last update timestamp |
| `publicMetadata` | json | Public metadata |
| `success` | boolean | Operation success status |
### `clerk_update_user`
Update an existing user in your Clerk application
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Yes | The Clerk Secret Key for API authentication |
| `userId` | string | Yes | The ID of the user to update |
| `firstName` | string | No | First name of the user |
| `lastName` | string | No | Last name of the user |
| `username` | string | No | Username \(must be unique\) |
| `password` | string | No | New password \(minimum 8 characters\) |
| `externalId` | string | No | External system identifier |
| `primaryEmailAddressId` | string | No | ID of verified email to set as primary |
| `primaryPhoneNumberId` | string | No | ID of verified phone to set as primary |
| `publicMetadata` | json | No | Public metadata \(JSON object\) |
| `privateMetadata` | json | No | Private metadata \(JSON object\) |
| `unsafeMetadata` | json | No | Unsafe metadata \(JSON object\) |
| `skipPasswordChecks` | boolean | No | Skip password validation checks |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `id` | string | Updated user ID |
| `username` | string | Username |
| `firstName` | string | First name |
| `lastName` | string | Last name |
| `imageUrl` | string | Profile image URL |
| `primaryEmailAddressId` | string | Primary email address ID |
| `primaryPhoneNumberId` | string | Primary phone number ID |
| `emailAddresses` | array | User email addresses |
| ↳ `id` | string | Email address ID |
| ↳ `emailAddress` | string | Email address |
| ↳ `verified` | boolean | Whether email is verified |
| `phoneNumbers` | array | User phone numbers |
| ↳ `id` | string | Phone number ID |
| ↳ `phoneNumber` | string | Phone number |
| ↳ `verified` | boolean | Whether phone is verified |
| `externalId` | string | External system ID |
| `banned` | boolean | Whether user is banned |
| `locked` | boolean | Whether user is locked |
| `createdAt` | number | Creation timestamp |
| `updatedAt` | number | Last update timestamp |
| `publicMetadata` | json | Public metadata |
| `success` | boolean | Operation success status |
### `clerk_delete_user`
Delete a user from your Clerk application
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Yes | The Clerk Secret Key for API authentication |
| `userId` | string | Yes | The ID of the user to delete |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `id` | string | Deleted user ID |
| `object` | string | Object type \(user\) |
| `deleted` | boolean | Whether the user was deleted |
| `success` | boolean | Operation success status |
### `clerk_list_organizations`
List all organizations in your Clerk application with optional filtering
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Yes | The Clerk Secret Key for API authentication |
| `limit` | number | No | Number of results per page \(1-500, default: 10\) |
| `offset` | number | No | Number of results to skip for pagination |
| `includeMembersCount` | boolean | No | Include member count for each organization |
| `query` | string | No | Search by organization ID, name, or slug |
| `orderBy` | string | No | Sort field \(name, created_at, members_count\) with +/- prefix |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `organizations` | array | Array of Clerk organization objects |
| ↳ `id` | string | Organization ID |
| ↳ `name` | string | Organization name |
| ↳ `slug` | string | Organization slug |
| ↳ `imageUrl` | string | Organization image URL |
| ↳ `hasImage` | boolean | Whether organization has an image |
| ↳ `membersCount` | number | Number of members |
| ↳ `pendingInvitationsCount` | number | Number of pending invitations |
| ↳ `maxAllowedMemberships` | number | Max allowed memberships |
| ↳ `adminDeleteEnabled` | boolean | Whether admin delete is enabled |
| ↳ `createdBy` | string | Creator user ID |
| ↳ `createdAt` | number | Creation timestamp |
| ↳ `updatedAt` | number | Last update timestamp |
| ↳ `publicMetadata` | json | Public metadata |
| `totalCount` | number | Total number of organizations |
| `success` | boolean | Operation success status |
### `clerk_get_organization`
Retrieve a single organization by ID or slug from Clerk
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Yes | The Clerk Secret Key for API authentication |
| `organizationId` | string | Yes | The ID or slug of the organization to retrieve |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `id` | string | Organization ID |
| `name` | string | Organization name |
| `slug` | string | Organization slug |
| `imageUrl` | string | Organization image URL |
| `hasImage` | boolean | Whether organization has an image |
| `membersCount` | number | Number of members |
| `pendingInvitationsCount` | number | Number of pending invitations |
| `maxAllowedMemberships` | number | Max allowed memberships |
| `adminDeleteEnabled` | boolean | Whether admin delete is enabled |
| `createdBy` | string | Creator user ID |
| `createdAt` | number | Creation timestamp |
| `updatedAt` | number | Last update timestamp |
| `publicMetadata` | json | Public metadata |
| `success` | boolean | Operation success status |
### `clerk_create_organization`
Create a new organization in your Clerk application
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Yes | The Clerk Secret Key for API authentication |
| `name` | string | Yes | Name of the organization |
| `createdBy` | string | Yes | User ID of the creator \(will become admin\) |
| `slug` | string | No | Slug identifier for the organization |
| `maxAllowedMemberships` | number | No | Maximum member capacity \(0 for unlimited\) |
| `publicMetadata` | json | No | Public metadata \(JSON object\) |
| `privateMetadata` | json | No | Private metadata \(JSON object\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `id` | string | Created organization ID |
| `name` | string | Organization name |
| `slug` | string | Organization slug |
| `imageUrl` | string | Organization image URL |
| `hasImage` | boolean | Whether organization has an image |
| `membersCount` | number | Number of members |
| `pendingInvitationsCount` | number | Number of pending invitations |
| `maxAllowedMemberships` | number | Max allowed memberships |
| `adminDeleteEnabled` | boolean | Whether admin delete is enabled |
| `createdBy` | string | Creator user ID |
| `createdAt` | number | Creation timestamp |
| `updatedAt` | number | Last update timestamp |
| `publicMetadata` | json | Public metadata |
| `success` | boolean | Operation success status |
### `clerk_list_sessions`
List sessions for a user or client in your Clerk application
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Yes | The Clerk Secret Key for API authentication |
| `userId` | string | No | User ID to list sessions for \(required if clientId not provided\) |
| `clientId` | string | No | Client ID to list sessions for \(required if userId not provided\) |
| `status` | string | No | Filter by session status \(abandoned, active, ended, expired, pending, removed, replaced, revoked\) |
| `limit` | number | No | Number of results per page \(1-500, default: 10\) |
| `offset` | number | No | Number of results to skip for pagination |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `sessions` | array | Array of Clerk session objects |
| ↳ `id` | string | Session ID |
| ↳ `userId` | string | User ID |
| ↳ `clientId` | string | Client ID |
| ↳ `status` | string | Session status |
| ↳ `lastActiveAt` | number | Last activity timestamp |
| ↳ `lastActiveOrganizationId` | string | Last active organization ID |
| ↳ `expireAt` | number | Expiration timestamp |
| ↳ `abandonAt` | number | Abandon timestamp |
| ↳ `createdAt` | number | Creation timestamp |
| ↳ `updatedAt` | number | Last update timestamp |
| `totalCount` | number | Total number of sessions |
| `success` | boolean | Operation success status |
### `clerk_get_session`
Retrieve a single session by ID from Clerk
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Yes | The Clerk Secret Key for API authentication |
| `sessionId` | string | Yes | The ID of the session to retrieve |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `id` | string | Session ID |
| `userId` | string | User ID |
| `clientId` | string | Client ID |
| `status` | string | Session status |
| `lastActiveAt` | number | Last activity timestamp |
| `lastActiveOrganizationId` | string | Last active organization ID |
| `expireAt` | number | Expiration timestamp |
| `abandonAt` | number | Abandon timestamp |
| `createdAt` | number | Creation timestamp |
| `updatedAt` | number | Last update timestamp |
| `success` | boolean | Operation success status |
### `clerk_revoke_session`
Revoke a session to immediately invalidate it
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `secretKey` | string | Yes | The Clerk Secret Key for API authentication |
| `sessionId` | string | Yes | The ID of the session to revoke |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `id` | string | Session ID |
| `userId` | string | User ID |
| `clientId` | string | Client ID |
| `status` | string | Session status \(should be revoked\) |
| `lastActiveAt` | number | Last activity timestamp |
| `lastActiveOrganizationId` | string | Last active organization ID |
| `expireAt` | number | Expiration timestamp |
| `abandonAt` | number | Abandon timestamp |
| `createdAt` | number | Creation timestamp |
| `updatedAt` | number | Last update timestamp |
| `success` | boolean | Operation success status |

View File

@@ -257,11 +257,6 @@ Search and retrieve logs from Datadog. Use for troubleshooting, analysis, or mon
| ↳ `service` | string | Service name | | ↳ `service` | string | Service name |
| ↳ `message` | string | Log message | | ↳ `message` | string | Log message |
| ↳ `status` | string | Log status/level | | ↳ `status` | string | Log status/level |
| ↳ `timestamp` | string | Log timestamp |
| ↳ `host` | string | Host name |
| ↳ `service` | string | Service name |
| ↳ `message` | string | Log message |
| ↳ `status` | string | Log status/level |
| `nextLogId` | string | Cursor for pagination | | `nextLogId` | string | Cursor for pagination |
### `datadog_send_logs` ### `datadog_send_logs`

View File

@@ -64,7 +64,7 @@ Send a message to a Discord channel
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `message` | string | Success or error message | | `message` | string | Success or error message |
| `data` | object | Discord message data | | `data` | object | Discord message data |
| ↳ `id` | string | Author user ID | | ↳ `id` | string | Message ID |
| ↳ `content` | string | Message content | | ↳ `content` | string | Message content |
| ↳ `channel_id` | string | Channel ID where message was sent | | ↳ `channel_id` | string | Channel ID where message was sent |
| ↳ `author` | object | Message author information | | ↳ `author` | object | Message author information |
@@ -72,9 +72,6 @@ Send a message to a Discord channel
| ↳ `username` | string | Author username | | ↳ `username` | string | Author username |
| ↳ `avatar` | string | Author avatar hash | | ↳ `avatar` | string | Author avatar hash |
| ↳ `bot` | boolean | Whether author is a bot | | ↳ `bot` | boolean | Whether author is a bot |
| ↳ `username` | string | Author username |
| ↳ `avatar` | string | Author avatar hash |
| ↳ `bot` | boolean | Whether author is a bot |
| ↳ `timestamp` | string | Message timestamp | | ↳ `timestamp` | string | Message timestamp |
| ↳ `edited_timestamp` | string | Message edited timestamp | | ↳ `edited_timestamp` | string | Message edited timestamp |
| ↳ `embeds` | array | Message embeds | | ↳ `embeds` | array | Message embeds |
@@ -102,7 +99,7 @@ Retrieve messages from a Discord channel
| `message` | string | Success or error message | | `message` | string | Success or error message |
| `data` | object | Container for messages data | | `data` | object | Container for messages data |
| ↳ `messages` | array | Array of Discord messages with full metadata | | ↳ `messages` | array | Array of Discord messages with full metadata |
| ↳ `id` | string | Author user ID | | ↳ `id` | string | Message ID |
| ↳ `content` | string | Message content | | ↳ `content` | string | Message content |
| ↳ `channel_id` | string | Channel ID | | ↳ `channel_id` | string | Channel ID |
| ↳ `author` | object | Message author information | | ↳ `author` | object | Message author information |
@@ -110,9 +107,6 @@ Retrieve messages from a Discord channel
| ↳ `username` | string | Author username | | ↳ `username` | string | Author username |
| ↳ `avatar` | string | Author avatar hash | | ↳ `avatar` | string | Author avatar hash |
| ↳ `bot` | boolean | Whether author is a bot | | ↳ `bot` | boolean | Whether author is a bot |
| ↳ `username` | string | Author username |
| ↳ `avatar` | string | Author avatar hash |
| ↳ `bot` | boolean | Whether author is a bot |
| ↳ `timestamp` | string | Message timestamp | | ↳ `timestamp` | string | Message timestamp |
| ↳ `edited_timestamp` | string | Message edited timestamp | | ↳ `edited_timestamp` | string | Message edited timestamp |
| ↳ `embeds` | array | Message embeds | | ↳ `embeds` | array | Message embeds |
@@ -120,24 +114,7 @@ Retrieve messages from a Discord channel
| ↳ `mentions` | array | User mentions in message | | ↳ `mentions` | array | User mentions in message |
| ↳ `mention_roles` | array | Role mentions in message | | ↳ `mention_roles` | array | Role mentions in message |
| ↳ `mention_everyone` | boolean | Whether message mentions everyone | | ↳ `mention_everyone` | boolean | Whether message mentions everyone |
| ↳ `id` | string | Author user ID |
| ↳ `content` | string | Message content |
| ↳ `channel_id` | string | Channel ID | | ↳ `channel_id` | string | Channel ID |
| ↳ `author` | object | Message author information |
| ↳ `id` | string | Author user ID |
| ↳ `username` | string | Author username |
| ↳ `avatar` | string | Author avatar hash |
| ↳ `bot` | boolean | Whether author is a bot |
| ↳ `username` | string | Author username |
| ↳ `avatar` | string | Author avatar hash |
| ↳ `bot` | boolean | Whether author is a bot |
| ↳ `timestamp` | string | Message timestamp |
| ↳ `edited_timestamp` | string | Message edited timestamp |
| ↳ `embeds` | array | Message embeds |
| ↳ `attachments` | array | Message attachments |
| ↳ `mentions` | array | User mentions in message |
| ↳ `mention_roles` | array | Role mentions in message |
| ↳ `mention_everyone` | boolean | Whether message mentions everyone |
### `discord_get_server` ### `discord_get_server`
@@ -681,9 +658,6 @@ Get information about a member in a Discord server
| ↳ `id` | string | User ID | | ↳ `id` | string | User ID |
| ↳ `username` | string | Username | | ↳ `username` | string | Username |
| ↳ `avatar` | string | Avatar hash | | ↳ `avatar` | string | Avatar hash |
| ↳ `id` | string | User ID |
| ↳ `username` | string | Username |
| ↳ `avatar` | string | Avatar hash |
| ↳ `nick` | string | Server nickname | | ↳ `nick` | string | Server nickname |
| ↳ `roles` | array | Array of role IDs | | ↳ `roles` | array | Array of role IDs |
| ↳ `joined_at` | string | When the member joined | | ↳ `joined_at` | string | When the member joined |

View File

@@ -105,11 +105,6 @@ Crawl entire websites and extract structured content from all accessible pages
| ↳ `language` | string | Page language | | ↳ `language` | string | Page language |
| ↳ `sourceURL` | string | Source URL of the page | | ↳ `sourceURL` | string | Source URL of the page |
| ↳ `statusCode` | number | HTTP status code | | ↳ `statusCode` | number | HTTP status code |
| ↳ `title` | string | Page title |
| ↳ `description` | string | Page description |
| ↳ `language` | string | Page language |
| ↳ `sourceURL` | string | Source URL of the page |
| ↳ `statusCode` | number | HTTP status code |
| `total` | number | Total number of pages found during crawl | | `total` | number | Total number of pages found during crawl |
| `creditsUsed` | number | Number of credits consumed by the crawl operation | | `creditsUsed` | number | Number of credits consumed by the crawl operation |

View File

@@ -1557,20 +1557,20 @@ Search for code across GitHub repositories. Use qualifiers like repo:owner/name,
| `total_count` | number | Total matching results | | `total_count` | number | Total matching results |
| `incomplete_results` | boolean | Whether results are incomplete | | `incomplete_results` | boolean | Whether results are incomplete |
| `items` | array | Array of code matches from GitHub API | | `items` | array | Array of code matches from GitHub API |
| ↳ `name` | string | Repository name | | ↳ `name` | string | File name |
| ↳ `path` | string | File path | | ↳ `path` | string | File path |
| ↳ `sha` | string | Blob SHA | | ↳ `sha` | string | Blob SHA |
| ↳ `url` | string | API URL | | ↳ `url` | string | API URL |
| ↳ `git_url` | string | Git blob URL | | ↳ `git_url` | string | Git blob URL |
| ↳ `html_url` | string | Profile page URL | | ↳ `html_url` | string | GitHub web URL |
| ↳ `score` | number | Search relevance score | | ↳ `score` | number | Search relevance score |
| ↳ `repository` | object | Repository containing the code | | ↳ `repository` | object | Repository containing the code |
| ↳ `id` | number | User ID | | ↳ `id` | number | Repository ID |
| ↳ `node_id` | string | GraphQL node ID | | ↳ `node_id` | string | GraphQL node ID |
| ↳ `name` | string | Repository name | | ↳ `name` | string | Repository name |
| ↳ `full_name` | string | Full name \(owner/repo\) | | ↳ `full_name` | string | Full name \(owner/repo\) |
| ↳ `private` | boolean | Whether repository is private | | ↳ `private` | boolean | Whether repository is private |
| ↳ `html_url` | string | Profile page URL | | ↳ `html_url` | string | GitHub web URL |
| ↳ `description` | string | Repository description | | ↳ `description` | string | Repository description |
| ↳ `fork` | boolean | Whether this is a fork | | ↳ `fork` | boolean | Whether this is a fork |
| ↳ `url` | string | API URL | | ↳ `url` | string | API URL |
@@ -1583,29 +1583,6 @@ Search for code across GitHub repositories. Use qualifiers like repo:owner/name,
| ↳ `html_url` | string | Profile page URL | | ↳ `html_url` | string | Profile page URL |
| ↳ `type` | string | User or Organization | | ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator | | ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `login` | string | Username |
| ↳ `avatar_url` | string | Avatar image URL |
| ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `id` | number | User ID |
| ↳ `node_id` | string | GraphQL node ID |
| ↳ `full_name` | string | Full name \(owner/repo\) |
| ↳ `private` | boolean | Whether repository is private |
| ↳ `description` | string | Repository description |
| ↳ `fork` | boolean | Whether this is a fork |
| ↳ `owner` | object | Repository owner |
| ↳ `login` | string | Username |
| ↳ `id` | number | User ID |
| ↳ `node_id` | string | GraphQL node ID |
| ↳ `avatar_url` | string | Avatar image URL |
| ↳ `url` | string | API URL |
| ↳ `html_url` | string | Profile page URL |
| ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `login` | string | Username |
| ↳ `avatar_url` | string | Avatar image URL |
| ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `text_matches` | array | Text matches showing context | | ↳ `text_matches` | array | Text matches showing context |
| ↳ `object_url` | string | Object URL | | ↳ `object_url` | string | Object URL |
| ↳ `object_type` | string | Object type | | ↳ `object_type` | string | Object type |
@@ -1614,17 +1591,6 @@ Search for code across GitHub repositories. Use qualifiers like repo:owner/name,
| ↳ `matches` | array | Match indices | | ↳ `matches` | array | Match indices |
| ↳ `text` | string | Matched text | | ↳ `text` | string | Matched text |
| ↳ `indices` | array | Start and end indices | | ↳ `indices` | array | Start and end indices |
| ↳ `text` | string | Matched text |
| ↳ `indices` | array | Start and end indices |
| ↳ `object_url` | string | Object URL |
| ↳ `object_type` | string | Object type |
| ↳ `property` | string | Property matched |
| ↳ `fragment` | string | Text fragment with match |
| ↳ `matches` | array | Match indices |
| ↳ `text` | string | Matched text |
| ↳ `indices` | array | Start and end indices |
| ↳ `text` | string | Matched text |
| ↳ `indices` | array | Start and end indices |
### `github_search_commits` ### `github_search_commits`
@@ -1648,23 +1614,20 @@ Search for commits across GitHub. Use qualifiers like repo:owner/name, author:us
| `total_count` | number | Total matching results | | `total_count` | number | Total matching results |
| `incomplete_results` | boolean | Whether results are incomplete | | `incomplete_results` | boolean | Whether results are incomplete |
| `items` | array | Array of commit objects from GitHub API | | `items` | array | Array of commit objects from GitHub API |
| ↳ `sha` | string | Parent SHA | | ↳ `sha` | string | Commit SHA |
| ↳ `node_id` | string | GraphQL node ID | | ↳ `node_id` | string | GraphQL node ID |
| ↳ `html_url` | string | Parent web URL | | ↳ `html_url` | string | Web URL |
| ↳ `url` | string | Parent API URL | | ↳ `url` | string | API URL |
| ↳ `comments_url` | string | Comments API URL | | ↳ `comments_url` | string | Comments API URL |
| ↳ `score` | number | Search relevance score | | ↳ `score` | number | Search relevance score |
| ↳ `commit` | object | Core commit data | | ↳ `commit` | object | Core commit data |
| ↳ `url` | string | Tree API URL | | ↳ `url` | string | Commit API URL |
| ↳ `message` | string | Commit message | | ↳ `message` | string | Commit message |
| ↳ `comment_count` | number | Number of comments | | ↳ `comment_count` | number | Number of comments |
| ↳ `author` | object | Git author | | ↳ `author` | object | Git author |
| ↳ `name` | string | Author name | | ↳ `name` | string | Author name |
| ↳ `email` | string | Author email | | ↳ `email` | string | Author email |
| ↳ `date` | string | Author date \(ISO 8601\) | | ↳ `date` | string | Author date \(ISO 8601\) |
| ↳ `name` | string | Committer name |
| ↳ `email` | string | Committer email |
| ↳ `date` | string | Commit date \(ISO 8601\) |
| ↳ `committer` | object | Git committer | | ↳ `committer` | object | Git committer |
| ↳ `name` | string | Committer name | | ↳ `name` | string | Committer name |
| ↳ `email` | string | Committer email | | ↳ `email` | string | Committer email |
@@ -1672,9 +1635,6 @@ Search for commits across GitHub. Use qualifiers like repo:owner/name, author:us
| ↳ `tree` | object | Tree object | | ↳ `tree` | object | Tree object |
| ↳ `sha` | string | Tree SHA | | ↳ `sha` | string | Tree SHA |
| ↳ `url` | string | Tree API URL | | ↳ `url` | string | Tree API URL |
| ↳ `sha` | string | Tree SHA |
| ↳ `message` | string | Commit message |
| ↳ `comment_count` | number | Number of comments |
| ↳ `author` | object | GitHub user \(author\) | | ↳ `author` | object | GitHub user \(author\) |
| ↳ `login` | string | Username | | ↳ `login` | string | Username |
| ↳ `id` | number | User ID | | ↳ `id` | number | User ID |
@@ -1684,9 +1644,6 @@ Search for commits across GitHub. Use qualifiers like repo:owner/name, author:us
| ↳ `html_url` | string | Profile URL | | ↳ `html_url` | string | Profile URL |
| ↳ `type` | string | User or Organization | | ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator | | ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `name` | string | Repository name |
| ↳ `email` | string | Committer email |
| ↳ `date` | string | Commit date \(ISO 8601\) |
| ↳ `committer` | object | GitHub user \(committer\) | | ↳ `committer` | object | GitHub user \(committer\) |
| ↳ `login` | string | Username | | ↳ `login` | string | Username |
| ↳ `id` | number | User ID | | ↳ `id` | number | User ID |
@@ -1696,38 +1653,13 @@ Search for commits across GitHub. Use qualifiers like repo:owner/name, author:us
| ↳ `html_url` | string | Profile URL | | ↳ `html_url` | string | Profile URL |
| ↳ `type` | string | User or Organization | | ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator | | ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `tree` | object | Tree object |
| ↳ `sha` | string | Tree SHA |
| ↳ `url` | string | Tree API URL |
| ↳ `login` | string | Username |
| ↳ `id` | number | User ID |
| ↳ `avatar_url` | string | Avatar image URL |
| ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `repository` | object | Repository containing the commit | | ↳ `repository` | object | Repository containing the commit |
| ↳ `id` | number | User ID | | ↳ `id` | number | Repository ID |
| ↳ `node_id` | string | GraphQL node ID | | ↳ `node_id` | string | GraphQL node ID |
| ↳ `name` | string | Repository name | | ↳ `name` | string | Repository name |
| ↳ `full_name` | string | Full name \(owner/repo\) | | ↳ `full_name` | string | Full name \(owner/repo\) |
| ↳ `private` | boolean | Whether repository is private | | ↳ `private` | boolean | Whether repository is private |
| ↳ `html_url` | string | Profile page URL | | ↳ `html_url` | string | GitHub web URL |
| ↳ `description` | string | Repository description |
| ↳ `owner` | object | Repository owner |
| ↳ `login` | string | Username |
| ↳ `id` | number | User ID |
| ↳ `node_id` | string | GraphQL node ID |
| ↳ `avatar_url` | string | Avatar image URL |
| ↳ `url` | string | API URL |
| ↳ `html_url` | string | Profile page URL |
| ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `login` | string | Username |
| ↳ `avatar_url` | string | Avatar image URL |
| ↳ `url` | string | API URL |
| ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `full_name` | string | Full name \(owner/repo\) |
| ↳ `private` | boolean | Whether repository is private |
| ↳ `description` | string | Repository description | | ↳ `description` | string | Repository description |
| ↳ `owner` | object | Repository owner | | ↳ `owner` | object | Repository owner |
| ↳ `login` | string | Username | | ↳ `login` | string | Username |
@@ -1765,10 +1697,10 @@ Search for issues and pull requests across GitHub. Use qualifiers like repo:owne
| `total_count` | number | Total matching results | | `total_count` | number | Total matching results |
| `incomplete_results` | boolean | Whether results are incomplete | | `incomplete_results` | boolean | Whether results are incomplete |
| `items` | array | Array of issue/PR objects from GitHub API | | `items` | array | Array of issue/PR objects from GitHub API |
| ↳ `id` | number | Milestone ID | | ↳ `id` | number | Issue ID |
| ↳ `node_id` | string | GraphQL node ID | | ↳ `node_id` | string | GraphQL node ID |
| ↳ `number` | number | Milestone number | | ↳ `number` | number | Issue number |
| ↳ `title` | string | Milestone title | | ↳ `title` | string | Title |
| ↳ `state` | string | State \(open or closed\) | | ↳ `state` | string | State \(open or closed\) |
| ↳ `locked` | boolean | Whether issue is locked | | ↳ `locked` | boolean | Whether issue is locked |
| ↳ `html_url` | string | Web URL | | ↳ `html_url` | string | Web URL |
@@ -1790,10 +1722,6 @@ Search for issues and pull requests across GitHub. Use qualifiers like repo:owne
| ↳ `html_url` | string | Profile page URL | | ↳ `html_url` | string | Profile page URL |
| ↳ `type` | string | User or Organization | | ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator | | ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `login` | string | Username |
| ↳ `avatar_url` | string | Avatar image URL |
| ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `labels` | array | Issue labels | | ↳ `labels` | array | Issue labels |
| ↳ `id` | number | Label ID | | ↳ `id` | number | Label ID |
| ↳ `node_id` | string | GraphQL node ID | | ↳ `node_id` | string | GraphQL node ID |
@@ -1802,10 +1730,6 @@ Search for issues and pull requests across GitHub. Use qualifiers like repo:owne
| ↳ `description` | string | Label description | | ↳ `description` | string | Label description |
| ↳ `color` | string | Hex color code | | ↳ `color` | string | Hex color code |
| ↳ `default` | boolean | Whether this is a default label | | ↳ `default` | boolean | Whether this is a default label |
| ↳ `name` | string | Label name |
| ↳ `description` | string | Milestone description |
| ↳ `color` | string | Hex color code |
| ↳ `default` | boolean | Whether this is a default label |
| ↳ `assignee` | object | Primary assignee | | ↳ `assignee` | object | Primary assignee |
| ↳ `login` | string | Username | | ↳ `login` | string | Username |
| ↳ `id` | number | User ID | | ↳ `id` | number | User ID |
@@ -1833,14 +1757,11 @@ Search for issues and pull requests across GitHub. Use qualifiers like repo:owne
| ↳ `state` | string | State \(open or closed\) | | ↳ `state` | string | State \(open or closed\) |
| ↳ `html_url` | string | Web URL | | ↳ `html_url` | string | Web URL |
| ↳ `due_on` | string | Due date | | ↳ `due_on` | string | Due date |
| ↳ `due_on` | string | Due date |
| ↳ `pull_request` | object | Pull request details \(if this is a PR\) | | ↳ `pull_request` | object | Pull request details \(if this is a PR\) |
| ↳ `url` | string | API URL | | ↳ `url` | string | API URL |
| ↳ `html_url` | string | Web URL | | ↳ `html_url` | string | Web URL |
| ↳ `diff_url` | string | Diff URL | | ↳ `diff_url` | string | Diff URL |
| ↳ `patch_url` | string | Patch URL | | ↳ `patch_url` | string | Patch URL |
| ↳ `diff_url` | string | Diff URL |
| ↳ `patch_url` | string | Patch URL |
### `github_search_repos` ### `github_search_repos`
@@ -1864,13 +1785,13 @@ Search for repositories across GitHub. Use qualifiers like language:python, star
| `total_count` | number | Total matching results | | `total_count` | number | Total matching results |
| `incomplete_results` | boolean | Whether results are incomplete | | `incomplete_results` | boolean | Whether results are incomplete |
| `items` | array | Array of repository objects from GitHub API | | `items` | array | Array of repository objects from GitHub API |
| ↳ `id` | number | User ID | | ↳ `id` | number | Repository ID |
| ↳ `node_id` | string | GraphQL node ID | | ↳ `node_id` | string | GraphQL node ID |
| ↳ `name` | string | License name | | ↳ `name` | string | Repository name |
| ↳ `full_name` | string | Full name \(owner/repo\) | | ↳ `full_name` | string | Full name \(owner/repo\) |
| ↳ `private` | boolean | Whether repository is private | | ↳ `private` | boolean | Whether repository is private |
| ↳ `description` | string | Repository description | | ↳ `description` | string | Repository description |
| ↳ `html_url` | string | Profile page URL | | ↳ `html_url` | string | GitHub web URL |
| ↳ `url` | string | API URL | | ↳ `url` | string | API URL |
| ↳ `fork` | boolean | Whether this is a fork | | ↳ `fork` | boolean | Whether this is a fork |
| ↳ `created_at` | string | Creation timestamp | | ↳ `created_at` | string | Creation timestamp |
@@ -1889,8 +1810,6 @@ Search for repositories across GitHub. Use qualifiers like language:python, star
| ↳ `key` | string | License key \(e.g., mit\) | | ↳ `key` | string | License key \(e.g., mit\) |
| ↳ `name` | string | License name | | ↳ `name` | string | License name |
| ↳ `spdx_id` | string | SPDX identifier | | ↳ `spdx_id` | string | SPDX identifier |
| ↳ `key` | string | License key \(e.g., mit\) |
| ↳ `spdx_id` | string | SPDX identifier |
| ↳ `owner` | object | Repository owner | | ↳ `owner` | object | Repository owner |
| ↳ `login` | string | Username | | ↳ `login` | string | Username |
| ↳ `id` | number | User ID | | ↳ `id` | number | User ID |
@@ -1900,10 +1819,6 @@ Search for repositories across GitHub. Use qualifiers like language:python, star
| ↳ `html_url` | string | Profile page URL | | ↳ `html_url` | string | Profile page URL |
| ↳ `type` | string | User or Organization | | ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator | | ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `login` | string | Username |
| ↳ `avatar_url` | string | Avatar image URL |
| ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator |
### `github_search_users` ### `github_search_users`
@@ -1969,22 +1884,19 @@ List commits in a repository with optional filtering by SHA, path, author, commi
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `items` | array | Array of commit objects from GitHub API | | `items` | array | Array of commit objects from GitHub API |
| ↳ `sha` | string | Parent SHA | | ↳ `sha` | string | Commit SHA |
| ↳ `node_id` | string | GraphQL node ID | | ↳ `node_id` | string | GraphQL node ID |
| ↳ `html_url` | string | Parent web URL | | ↳ `html_url` | string | Web URL |
| ↳ `url` | string | Parent API URL | | ↳ `url` | string | API URL |
| ↳ `comments_url` | string | Comments API URL | | ↳ `comments_url` | string | Comments API URL |
| ↳ `commit` | object | Core commit data | | ↳ `commit` | object | Core commit data |
| ↳ `url` | string | Tree API URL | | ↳ `url` | string | Commit API URL |
| ↳ `message` | string | Commit message | | ↳ `message` | string | Commit message |
| ↳ `comment_count` | number | Number of comments | | ↳ `comment_count` | number | Number of comments |
| ↳ `author` | object | Git author | | ↳ `author` | object | Git author |
| ↳ `name` | string | Author name | | ↳ `name` | string | Author name |
| ↳ `email` | string | Author email | | ↳ `email` | string | Author email |
| ↳ `date` | string | Author date \(ISO 8601\) | | ↳ `date` | string | Author date \(ISO 8601\) |
| ↳ `name` | string | Committer name |
| ↳ `email` | string | Committer email |
| ↳ `date` | string | Commit date \(ISO 8601\) |
| ↳ `committer` | object | Git committer | | ↳ `committer` | object | Git committer |
| ↳ `name` | string | Committer name | | ↳ `name` | string | Committer name |
| ↳ `email` | string | Committer email | | ↳ `email` | string | Committer email |
@@ -1992,18 +1904,11 @@ List commits in a repository with optional filtering by SHA, path, author, commi
| ↳ `tree` | object | Tree object | | ↳ `tree` | object | Tree object |
| ↳ `sha` | string | Tree SHA | | ↳ `sha` | string | Tree SHA |
| ↳ `url` | string | Tree API URL | | ↳ `url` | string | Tree API URL |
| ↳ `sha` | string | Tree SHA |
| ↳ `verification` | object | Signature verification | | ↳ `verification` | object | Signature verification |
| ↳ `verified` | boolean | Whether signature is verified | | ↳ `verified` | boolean | Whether signature is verified |
| ↳ `reason` | string | Verification reason | | ↳ `reason` | string | Verification reason |
| ↳ `signature` | string | GPG signature | | ↳ `signature` | string | GPG signature |
| ↳ `payload` | string | Signed payload | | ↳ `payload` | string | Signed payload |
| ↳ `verified` | boolean | Whether signature is verified |
| ↳ `reason` | string | Verification reason |
| ↳ `signature` | string | GPG signature |
| ↳ `payload` | string | Signed payload |
| ↳ `message` | string | Commit message |
| ↳ `comment_count` | number | Number of comments |
| ↳ `author` | object | GitHub user \(author\) | | ↳ `author` | object | GitHub user \(author\) |
| ↳ `login` | string | Username | | ↳ `login` | string | Username |
| ↳ `id` | number | User ID | | ↳ `id` | number | User ID |
@@ -2013,9 +1918,6 @@ List commits in a repository with optional filtering by SHA, path, author, commi
| ↳ `html_url` | string | Profile URL | | ↳ `html_url` | string | Profile URL |
| ↳ `type` | string | User or Organization | | ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator | | ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `name` | string | Committer name |
| ↳ `email` | string | Committer email |
| ↳ `date` | string | Commit date \(ISO 8601\) |
| ↳ `committer` | object | GitHub user \(committer\) | | ↳ `committer` | object | GitHub user \(committer\) |
| ↳ `login` | string | Username | | ↳ `login` | string | Username |
| ↳ `id` | number | User ID | | ↳ `id` | number | User ID |
@@ -2025,23 +1927,6 @@ List commits in a repository with optional filtering by SHA, path, author, commi
| ↳ `html_url` | string | Profile URL | | ↳ `html_url` | string | Profile URL |
| ↳ `type` | string | User or Organization | | ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator | | ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `tree` | object | Tree object |
| ↳ `sha` | string | Tree SHA |
| ↳ `url` | string | Tree API URL |
| ↳ `verification` | object | Signature verification |
| ↳ `verified` | boolean | Whether signature is verified |
| ↳ `reason` | string | Verification reason |
| ↳ `signature` | string | GPG signature |
| ↳ `payload` | string | Signed payload |
| ↳ `verified` | boolean | Whether signature is verified |
| ↳ `reason` | string | Verification reason |
| ↳ `signature` | string | GPG signature |
| ↳ `payload` | string | Signed payload |
| ↳ `login` | string | Username |
| ↳ `id` | number | User ID |
| ↳ `avatar_url` | string | Avatar URL |
| ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `parents` | array | Parent commits | | ↳ `parents` | array | Parent commits |
| ↳ `sha` | string | Parent SHA | | ↳ `sha` | string | Parent SHA |
| ↳ `url` | string | Parent API URL | | ↳ `url` | string | Parent API URL |
@@ -2071,16 +1956,13 @@ Get detailed information about a specific commit including files changed and sta
| `url` | string | API URL | | `url` | string | API URL |
| `comments_url` | string | Comments API URL | | `comments_url` | string | Comments API URL |
| `commit` | object | Core commit data | | `commit` | object | Core commit data |
| ↳ `url` | string | Tree API URL | | ↳ `url` | string | Commit API URL |
| ↳ `message` | string | Commit message | | ↳ `message` | string | Commit message |
| ↳ `comment_count` | number | Number of comments | | ↳ `comment_count` | number | Number of comments |
| ↳ `author` | object | Git author | | ↳ `author` | object | Git author |
| ↳ `name` | string | Author name | | ↳ `name` | string | Author name |
| ↳ `email` | string | Author email | | ↳ `email` | string | Author email |
| ↳ `date` | string | Author date \(ISO 8601\) | | ↳ `date` | string | Author date \(ISO 8601\) |
| ↳ `name` | string | Committer name |
| ↳ `email` | string | Committer email |
| ↳ `date` | string | Commit date \(ISO 8601\) |
| ↳ `committer` | object | Git committer | | ↳ `committer` | object | Git committer |
| ↳ `name` | string | Committer name | | ↳ `name` | string | Committer name |
| ↳ `email` | string | Committer email | | ↳ `email` | string | Committer email |
@@ -2088,16 +1970,11 @@ Get detailed information about a specific commit including files changed and sta
| ↳ `tree` | object | Tree object | | ↳ `tree` | object | Tree object |
| ↳ `sha` | string | Tree SHA | | ↳ `sha` | string | Tree SHA |
| ↳ `url` | string | Tree API URL | | ↳ `url` | string | Tree API URL |
| ↳ `sha` | string | Tree SHA |
| ↳ `verification` | object | Signature verification | | ↳ `verification` | object | Signature verification |
| ↳ `verified` | boolean | Whether signature is verified | | ↳ `verified` | boolean | Whether signature is verified |
| ↳ `reason` | string | Verification reason | | ↳ `reason` | string | Verification reason |
| ↳ `signature` | string | GPG signature | | ↳ `signature` | string | GPG signature |
| ↳ `payload` | string | Signed payload | | ↳ `payload` | string | Signed payload |
| ↳ `verified` | boolean | Whether signature is verified |
| ↳ `reason` | string | Verification reason |
| ↳ `signature` | string | GPG signature |
| ↳ `payload` | string | Signed payload |
| `author` | object | GitHub user \(author\) | | `author` | object | GitHub user \(author\) |
| ↳ `login` | string | Username | | ↳ `login` | string | Username |
| ↳ `id` | number | User ID | | ↳ `id` | number | User ID |
@@ -2167,7 +2044,6 @@ Compare two commits or branches to see the diff, commits between them, and chang
| ↳ `message` | string | Commit message | | ↳ `message` | string | Commit message |
| ↳ `author` | object | Git author \(name, email, date\) | | ↳ `author` | object | Git author \(name, email, date\) |
| ↳ `committer` | object | Git committer \(name, email, date\) | | ↳ `committer` | object | Git committer \(name, email, date\) |
| ↳ `message` | string | Commit message |
| ↳ `author` | object | GitHub user \(author\) | | ↳ `author` | object | GitHub user \(author\) |
| ↳ `committer` | object | GitHub user \(committer\) | | ↳ `committer` | object | GitHub user \(committer\) |
| `merge_base_commit` | object | Merge base commit object | | `merge_base_commit` | object | Merge base commit object |
@@ -2180,7 +2056,6 @@ Compare two commits or branches to see the diff, commits between them, and chang
| ↳ `message` | string | Commit message | | ↳ `message` | string | Commit message |
| ↳ `author` | object | Git author \(name, email, date\) | | ↳ `author` | object | Git author \(name, email, date\) |
| ↳ `committer` | object | Git committer \(name, email, date\) | | ↳ `committer` | object | Git committer \(name, email, date\) |
| ↳ `message` | string | Commit message |
| ↳ `author` | object | GitHub user | | ↳ `author` | object | GitHub user |
| ↳ `committer` | object | GitHub user | | ↳ `committer` | object | GitHub user |
| `files` | array | Changed files \(diff entries\) | | `files` | array | Changed files \(diff entries\) |
@@ -2271,13 +2146,6 @@ Get a gist by ID including its file contents
| `comments_url` | string | Comments API URL | | `comments_url` | string | Comments API URL |
| `truncated` | boolean | Whether content is truncated | | `truncated` | boolean | Whether content is truncated |
| `files` | object | Files in the gist \(keyed by filename\) | | `files` | object | Files in the gist \(keyed by filename\) |
| ↳ `filename` | string | File name |
| ↳ `type` | string | MIME type |
| ↳ `language` | string | Programming language |
| ↳ `raw_url` | string | Raw file URL |
| ↳ `size` | number | File size in bytes |
| ↳ `truncated` | boolean | Whether content is truncated |
| ↳ `content` | string | File content |
| `owner` | object | Gist owner | | `owner` | object | Gist owner |
| ↳ `login` | string | Username | | ↳ `login` | string | Username |
| ↳ `id` | number | User ID | | ↳ `id` | number | User ID |
@@ -2307,10 +2175,10 @@ List gists for a user or the authenticated user
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `items` | array | Array of gist objects from GitHub API | | `items` | array | Array of gist objects from GitHub API |
| ↳ `id` | number | User ID | | ↳ `id` | string | Gist ID |
| ↳ `node_id` | string | GraphQL node ID | | ↳ `node_id` | string | GraphQL node ID |
| ↳ `url` | string | API URL | | ↳ `url` | string | API URL |
| ↳ `html_url` | string | Profile page URL | | ↳ `html_url` | string | Web URL |
| ↳ `forks_url` | string | Forks API URL | | ↳ `forks_url` | string | Forks API URL |
| ↳ `commits_url` | string | Commits API URL | | ↳ `commits_url` | string | Commits API URL |
| ↳ `git_pull_url` | string | Git pull URL | | ↳ `git_pull_url` | string | Git pull URL |
@@ -2332,10 +2200,6 @@ List gists for a user or the authenticated user
| ↳ `html_url` | string | Profile page URL | | ↳ `html_url` | string | Profile page URL |
| ↳ `type` | string | User or Organization | | ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator | | ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `login` | string | Username |
| ↳ `avatar_url` | string | Avatar image URL |
| ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator |
| `count` | number | Number of gists returned | | `count` | number | Number of gists returned |
### `github_update_gist` ### `github_update_gist`
@@ -2503,14 +2367,13 @@ Fork a repository to your account or an organization
| ↳ `type` | string | User or Organization | | ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator | | ↳ `site_admin` | boolean | GitHub staff indicator |
| `parent` | object | Parent repository \(source of the fork\) | | `parent` | object | Parent repository \(source of the fork\) |
| ↳ `id` | number | User ID | | ↳ `id` | number | Repository ID |
| ↳ `full_name` | string | Full name | | ↳ `full_name` | string | Full name |
| ↳ `html_url` | string | Web URL | | ↳ `html_url` | string | Web URL |
| ↳ `description` | string | Description | | ↳ `description` | string | Description |
| ↳ `owner` | object | Parent owner | | ↳ `owner` | object | Parent owner |
| ↳ `login` | string | Username | | ↳ `login` | string | Username |
| ↳ `id` | number | User ID | | ↳ `id` | number | User ID |
| ↳ `login` | string | Username |
| `source` | object | Source repository \(ultimate origin\) | | `source` | object | Source repository \(ultimate origin\) |
| ↳ `id` | number | Repository ID | | ↳ `id` | number | Repository ID |
| ↳ `full_name` | string | Full name | | ↳ `full_name` | string | Full name |
@@ -2536,13 +2399,13 @@ List forks of a repository
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `items` | array | Array of fork repository objects from GitHub API | | `items` | array | Array of fork repository objects from GitHub API |
| ↳ `id` | number | User ID | | ↳ `id` | number | Repository ID |
| ↳ `node_id` | string | GraphQL node ID | | ↳ `node_id` | string | GraphQL node ID |
| ↳ `name` | string | Repository name | | ↳ `name` | string | Repository name |
| ↳ `full_name` | string | Full name \(owner/repo\) | | ↳ `full_name` | string | Full name \(owner/repo\) |
| ↳ `private` | boolean | Whether repository is private | | ↳ `private` | boolean | Whether repository is private |
| ↳ `description` | string | Repository description | | ↳ `description` | string | Repository description |
| ↳ `html_url` | string | Profile page URL | | ↳ `html_url` | string | GitHub web URL |
| ↳ `url` | string | API URL | | ↳ `url` | string | API URL |
| ↳ `fork` | boolean | Whether this is a fork | | ↳ `fork` | boolean | Whether this is a fork |
| ↳ `created_at` | string | Creation timestamp | | ↳ `created_at` | string | Creation timestamp |
@@ -2567,10 +2430,6 @@ List forks of a repository
| ↳ `html_url` | string | Profile page URL | | ↳ `html_url` | string | Profile page URL |
| ↳ `type` | string | User or Organization | | ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator | | ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `login` | string | Username |
| ↳ `avatar_url` | string | Avatar image URL |
| ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator |
| `count` | number | Number of forks returned | | `count` | number | Number of forks returned |
### `github_create_milestone` ### `github_create_milestone`
@@ -2667,14 +2526,14 @@ List milestones in a repository
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `items` | array | Array of milestone objects from GitHub API | | `items` | array | Array of milestone objects from GitHub API |
| ↳ `id` | number | User ID | | ↳ `id` | number | Milestone ID |
| ↳ `node_id` | string | GraphQL node ID | | ↳ `node_id` | string | GraphQL node ID |
| ↳ `number` | number | Milestone number | | ↳ `number` | number | Milestone number |
| ↳ `title` | string | Milestone title | | ↳ `title` | string | Milestone title |
| ↳ `description` | string | Milestone description | | ↳ `description` | string | Milestone description |
| ↳ `state` | string | State \(open or closed\) | | ↳ `state` | string | State \(open or closed\) |
| ↳ `url` | string | API URL | | ↳ `url` | string | API URL |
| ↳ `html_url` | string | Profile page URL | | ↳ `html_url` | string | GitHub web URL |
| ↳ `labels_url` | string | Labels API URL | | ↳ `labels_url` | string | Labels API URL |
| ↳ `due_on` | string | Due date \(ISO 8601\) | | ↳ `due_on` | string | Due date \(ISO 8601\) |
| ↳ `open_issues` | number | Number of open issues | | ↳ `open_issues` | number | Number of open issues |
@@ -2691,10 +2550,6 @@ List milestones in a repository
| ↳ `html_url` | string | Profile page URL | | ↳ `html_url` | string | Profile page URL |
| ↳ `type` | string | User or Organization | | ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator | | ↳ `site_admin` | boolean | GitHub staff indicator |
| ↳ `login` | string | Username |
| ↳ `avatar_url` | string | Avatar image URL |
| ↳ `type` | string | User or Organization |
| ↳ `site_admin` | boolean | GitHub staff indicator |
| `count` | number | Number of milestones returned | | `count` | number | Number of milestones returned |
### `github_update_milestone` ### `github_update_milestone`

View File

@@ -139,25 +139,10 @@ Apply multiple updates to a form (add items, update info, change settings, etc.)
| ↳ `title` | string | The form title visible to responders | | ↳ `title` | string | The form title visible to responders |
| ↳ `description` | string | The form description | | ↳ `description` | string | The form description |
| ↳ `documentTitle` | string | The document title visible in Drive | | ↳ `documentTitle` | string | The document title visible in Drive |
| ↳ `title` | string | Item title |
| ↳ `description` | string | Item description |
| ↳ `documentTitle` | string | The document title visible in Drive |
| ↳ `settings` | object | Form settings | | ↳ `settings` | object | Form settings |
| ↳ `quizSettings` | object | Quiz settings | | ↳ `quizSettings` | object | Quiz settings |
| ↳ `isQuiz` | boolean | Whether the form is a quiz | | ↳ `isQuiz` | boolean | Whether the form is a quiz |
| ↳ `isQuiz` | boolean | Whether the form is a quiz |
| ↳ `emailCollectionType` | string | Email collection type | | ↳ `emailCollectionType` | string | Email collection type |
| ↳ `quizSettings` | object | Quiz settings |
| ↳ `isQuiz` | boolean | Whether the form is a quiz |
| ↳ `isQuiz` | boolean | Whether the form is a quiz |
| ↳ `emailCollectionType` | string | Email collection type |
| ↳ `itemId` | string | Item ID |
| ↳ `questionItem` | json | Question item configuration |
| ↳ `questionGroupItem` | json | Question group configuration |
| ↳ `pageBreakItem` | json | Page break configuration |
| ↳ `textItem` | json | Text item configuration |
| ↳ `imageItem` | json | Image item configuration |
| ↳ `videoItem` | json | Video item configuration |
| ↳ `revisionId` | string | The revision ID of the form | | ↳ `revisionId` | string | The revision ID of the form |
| ↳ `responderUri` | string | The URI to share with responders | | ↳ `responderUri` | string | The URI to share with responders |
| ↳ `linkedSheetId` | string | The ID of the linked Google Sheet | | ↳ `linkedSheetId` | string | The ID of the linked Google Sheet |
@@ -165,13 +150,6 @@ Apply multiple updates to a form (add items, update info, change settings, etc.)
| ↳ `publishState` | object | Current publish state | | ↳ `publishState` | object | Current publish state |
| ↳ `isPublished` | boolean | Whether the form is published | | ↳ `isPublished` | boolean | Whether the form is published |
| ↳ `isAcceptingResponses` | boolean | Whether the form is accepting responses | | ↳ `isAcceptingResponses` | boolean | Whether the form is accepting responses |
| ↳ `isPublished` | boolean | Whether the form is published |
| ↳ `isAcceptingResponses` | boolean | Whether the form is accepting responses |
| ↳ `publishState` | object | Current publish state |
| ↳ `isPublished` | boolean | Whether the form is published |
| ↳ `isAcceptingResponses` | boolean | Whether the form is accepting responses |
| ↳ `isPublished` | boolean | Whether the form is published |
| ↳ `isAcceptingResponses` | boolean | Whether the form is accepting responses |
### `google_forms_set_publish_settings` ### `google_forms_set_publish_settings`
@@ -194,8 +172,6 @@ Update the publish settings of a form (publish/unpublish, accept responses)
| ↳ `publishState` | object | The publish state | | ↳ `publishState` | object | The publish state |
| ↳ `isPublished` | boolean | Whether the form is published | | ↳ `isPublished` | boolean | Whether the form is published |
| ↳ `isAcceptingResponses` | boolean | Whether the form accepts responses | | ↳ `isAcceptingResponses` | boolean | Whether the form accepts responses |
| ↳ `isPublished` | boolean | Whether the form is published |
| ↳ `isAcceptingResponses` | boolean | Whether the form accepts responses |
### `google_forms_create_watch` ### `google_forms_create_watch`

View File

@@ -57,8 +57,6 @@ Read content from a Google Slides presentation
| ↳ `pageSize` | object | Presentation page size | | ↳ `pageSize` | object | Presentation page size |
| ↳ `width` | json | Page width as a Dimension object | | ↳ `width` | json | Page width as a Dimension object |
| ↳ `height` | json | Page height as a Dimension object | | ↳ `height` | json | Page height as a Dimension object |
| ↳ `width` | json | Page width as a Dimension object |
| ↳ `height` | json | Page height as a Dimension object |
| ↳ `mimeType` | string | The mime type of the presentation | | ↳ `mimeType` | string | The mime type of the presentation |
| ↳ `url` | string | URL to open the presentation | | ↳ `url` | string | URL to open the presentation |

View File

@@ -60,8 +60,5 @@ Generate completions using Hugging Face Inference API
| ↳ `prompt_tokens` | number | Number of tokens in the prompt | | ↳ `prompt_tokens` | number | Number of tokens in the prompt |
| ↳ `completion_tokens` | number | Number of tokens in the completion | | ↳ `completion_tokens` | number | Number of tokens in the completion |
| ↳ `total_tokens` | number | Total number of tokens used | | ↳ `total_tokens` | number | Total number of tokens used |
| ↳ `prompt_tokens` | number | Number of tokens in the prompt |
| ↳ `completion_tokens` | number | Number of tokens in the completion |
| ↳ `total_tokens` | number | Total number of tokens used |

View File

@@ -62,6 +62,5 @@ Generate images using OpenAI
| ↳ `image` | string | Base64 encoded image data | | ↳ `image` | string | Base64 encoded image data |
| ↳ `metadata` | object | Image generation metadata | | ↳ `metadata` | object | Image generation metadata |
| ↳ `model` | string | Model used for image generation | | ↳ `model` | string | Model used for image generation |
| ↳ `model` | string | Model used for image generation |

View File

@@ -57,8 +57,8 @@ List incidents from incident.io. Returns a list of incidents with their details
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `incidents` | array | List of incidents | | `incidents` | array | List of incidents |
| ↳ `id` | string | Type ID | | ↳ `id` | string | Incident ID |
| ↳ `name` | string | Type name | | ↳ `name` | string | Incident name |
| ↳ `summary` | string | Brief summary of the incident | | ↳ `summary` | string | Brief summary of the incident |
| ↳ `description` | string | Detailed description of the incident | | ↳ `description` | string | Detailed description of the incident |
| ↳ `mode` | string | Incident mode \(e.g., standard, retrospective\) | | ↳ `mode` | string | Incident mode \(e.g., standard, retrospective\) |
@@ -67,12 +67,10 @@ List incidents from incident.io. Returns a list of incidents with their details
| ↳ `id` | string | Severity ID | | ↳ `id` | string | Severity ID |
| ↳ `name` | string | Severity name | | ↳ `name` | string | Severity name |
| ↳ `rank` | number | Severity rank | | ↳ `rank` | number | Severity rank |
| ↳ `rank` | number | Severity rank |
| ↳ `status` | object | Current status of the incident | | ↳ `status` | object | Current status of the incident |
| ↳ `id` | string | Status ID | | ↳ `id` | string | Status ID |
| ↳ `name` | string | Status name | | ↳ `name` | string | Status name |
| ↳ `category` | string | Status category | | ↳ `category` | string | Status category |
| ↳ `category` | string | Status category |
| ↳ `incident_type` | object | Type of the incident | | ↳ `incident_type` | object | Type of the incident |
| ↳ `id` | string | Type ID | | ↳ `id` | string | Type ID |
| ↳ `name` | string | Type name | | ↳ `name` | string | Type name |
@@ -109,8 +107,8 @@ Create a new incident in incident.io. Requires idempotency_key, severity_id, and
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `incident` | object | The created incident object | | `incident` | object | The created incident object |
| ↳ `id` | string | Type ID | | ↳ `id` | string | Incident ID |
| ↳ `name` | string | Type name | | ↳ `name` | string | Incident name |
| ↳ `summary` | string | Brief summary of the incident | | ↳ `summary` | string | Brief summary of the incident |
| ↳ `description` | string | Detailed description of the incident | | ↳ `description` | string | Detailed description of the incident |
| ↳ `mode` | string | Incident mode \(e.g., standard, retrospective\) | | ↳ `mode` | string | Incident mode \(e.g., standard, retrospective\) |
@@ -119,12 +117,10 @@ Create a new incident in incident.io. Requires idempotency_key, severity_id, and
| ↳ `id` | string | Severity ID | | ↳ `id` | string | Severity ID |
| ↳ `name` | string | Severity name | | ↳ `name` | string | Severity name |
| ↳ `rank` | number | Severity rank | | ↳ `rank` | number | Severity rank |
| ↳ `rank` | number | Severity rank |
| ↳ `status` | object | Current status of the incident | | ↳ `status` | object | Current status of the incident |
| ↳ `id` | string | Status ID | | ↳ `id` | string | Status ID |
| ↳ `name` | string | Status name | | ↳ `name` | string | Status name |
| ↳ `category` | string | Status category | | ↳ `category` | string | Status category |
| ↳ `category` | string | Status category |
| ↳ `incident_type` | object | Type of the incident | | ↳ `incident_type` | object | Type of the incident |
| ↳ `id` | string | Type ID | | ↳ `id` | string | Type ID |
| ↳ `name` | string | Type name | | ↳ `name` | string | Type name |
@@ -151,8 +147,8 @@ Retrieve detailed information about a specific incident from incident.io by its
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `incident` | object | Detailed incident information | | `incident` | object | Detailed incident information |
| ↳ `id` | string | Type ID | | ↳ `id` | string | Incident ID |
| ↳ `name` | string | Type name | | ↳ `name` | string | Incident name |
| ↳ `summary` | string | Brief summary of the incident | | ↳ `summary` | string | Brief summary of the incident |
| ↳ `description` | string | Detailed description of the incident | | ↳ `description` | string | Detailed description of the incident |
| ↳ `mode` | string | Incident mode \(e.g., standard, retrospective\) | | ↳ `mode` | string | Incident mode \(e.g., standard, retrospective\) |
@@ -162,12 +158,10 @@ Retrieve detailed information about a specific incident from incident.io by its
| ↳ `id` | string | Severity ID | | ↳ `id` | string | Severity ID |
| ↳ `name` | string | Severity name | | ↳ `name` | string | Severity name |
| ↳ `rank` | number | Severity rank | | ↳ `rank` | number | Severity rank |
| ↳ `rank` | number | Severity rank |
| ↳ `status` | object | Current status of the incident | | ↳ `status` | object | Current status of the incident |
| ↳ `id` | string | Status ID | | ↳ `id` | string | Status ID |
| ↳ `name` | string | Status name | | ↳ `name` | string | Status name |
| ↳ `category` | string | Status category | | ↳ `category` | string | Status category |
| ↳ `category` | string | Status category |
| ↳ `incident_type` | object | Type of the incident | | ↳ `incident_type` | object | Type of the incident |
| ↳ `id` | string | Type ID | | ↳ `id` | string | Type ID |
| ↳ `name` | string | Type name | | ↳ `name` | string | Type name |
@@ -202,8 +196,8 @@ Update an existing incident in incident.io. Can update name, summary, severity,
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `incident` | object | The updated incident object | | `incident` | object | The updated incident object |
| ↳ `id` | string | Type ID | | ↳ `id` | string | Incident ID |
| ↳ `name` | string | Type name | | ↳ `name` | string | Incident name |
| ↳ `summary` | string | Brief summary of the incident | | ↳ `summary` | string | Brief summary of the incident |
| ↳ `description` | string | Detailed description of the incident | | ↳ `description` | string | Detailed description of the incident |
| ↳ `mode` | string | Incident mode \(e.g., standard, retrospective\) | | ↳ `mode` | string | Incident mode \(e.g., standard, retrospective\) |
@@ -212,12 +206,10 @@ Update an existing incident in incident.io. Can update name, summary, severity,
| ↳ `id` | string | Severity ID | | ↳ `id` | string | Severity ID |
| ↳ `name` | string | Severity name | | ↳ `name` | string | Severity name |
| ↳ `rank` | number | Severity rank | | ↳ `rank` | number | Severity rank |
| ↳ `rank` | number | Severity rank |
| ↳ `status` | object | Current status of the incident | | ↳ `status` | object | Current status of the incident |
| ↳ `id` | string | Status ID | | ↳ `id` | string | Status ID |
| ↳ `name` | string | Status name | | ↳ `name` | string | Status name |
| ↳ `category` | string | Status category | | ↳ `category` | string | Status category |
| ↳ `category` | string | Status category |
| ↳ `incident_type` | object | Type of the incident | | ↳ `incident_type` | object | Type of the incident |
| ↳ `id` | string | Type ID | | ↳ `id` | string | Type ID |
| ↳ `name` | string | Type name | | ↳ `name` | string | Type name |
@@ -245,14 +237,12 @@ List actions from incident.io. Optionally filter by incident ID.
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `actions` | array | List of actions | | `actions` | array | List of actions |
| ↳ `id` | string | User ID | | ↳ `id` | string | Action ID |
| ↳ `description` | string | Action description | | ↳ `description` | string | Action description |
| ↳ `assignee` | object | Assigned user | | ↳ `assignee` | object | Assigned user |
| ↳ `id` | string | User ID | | ↳ `id` | string | User ID |
| ↳ `name` | string | User name | | ↳ `name` | string | User name |
| ↳ `email` | string | User email | | ↳ `email` | string | User email |
| ↳ `name` | string | User name |
| ↳ `email` | string | User email |
| ↳ `status` | string | Action status | | ↳ `status` | string | Action status |
| ↳ `due_at` | string | Due date/time | | ↳ `due_at` | string | Due date/time |
| ↳ `created_at` | string | Creation timestamp | | ↳ `created_at` | string | Creation timestamp |
@@ -267,9 +257,6 @@ List actions from incident.io. Optionally filter by incident ID.
| ↳ `provider` | string | Issue tracking provider \(e.g., Jira, Linear\) | | ↳ `provider` | string | Issue tracking provider \(e.g., Jira, Linear\) |
| ↳ `issue_name` | string | Issue identifier | | ↳ `issue_name` | string | Issue identifier |
| ↳ `issue_permalink` | string | URL to the external issue | | ↳ `issue_permalink` | string | URL to the external issue |
| ↳ `provider` | string | Issue tracking provider \(e.g., Jira, Linear\) |
| ↳ `issue_name` | string | Issue identifier |
| ↳ `issue_permalink` | string | URL to the external issue |
### `incidentio_actions_show` ### `incidentio_actions_show`
@@ -287,14 +274,12 @@ Get detailed information about a specific action from incident.io.
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `action` | object | Action details | | `action` | object | Action details |
| ↳ `id` | string | User ID | | ↳ `id` | string | Action ID |
| ↳ `description` | string | Action description | | ↳ `description` | string | Action description |
| ↳ `assignee` | object | Assigned user | | ↳ `assignee` | object | Assigned user |
| ↳ `id` | string | User ID | | ↳ `id` | string | User ID |
| ↳ `name` | string | User name | | ↳ `name` | string | User name |
| ↳ `email` | string | User email | | ↳ `email` | string | User email |
| ↳ `name` | string | User name |
| ↳ `email` | string | User email |
| ↳ `status` | string | Action status | | ↳ `status` | string | Action status |
| ↳ `due_at` | string | Due date/time | | ↳ `due_at` | string | Due date/time |
| ↳ `created_at` | string | Creation timestamp | | ↳ `created_at` | string | Creation timestamp |
@@ -309,9 +294,6 @@ Get detailed information about a specific action from incident.io.
| ↳ `provider` | string | Issue tracking provider \(e.g., Jira, Linear\) | | ↳ `provider` | string | Issue tracking provider \(e.g., Jira, Linear\) |
| ↳ `issue_name` | string | Issue identifier | | ↳ `issue_name` | string | Issue identifier |
| ↳ `issue_permalink` | string | URL to the external issue | | ↳ `issue_permalink` | string | URL to the external issue |
| ↳ `provider` | string | Issue tracking provider \(e.g., Jira, Linear\) |
| ↳ `issue_name` | string | Issue identifier |
| ↳ `issue_permalink` | string | URL to the external issue |
### `incidentio_follow_ups_list` ### `incidentio_follow_ups_list`
@@ -330,22 +312,19 @@ List follow-ups from incident.io. Optionally filter by incident ID.
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `follow_ups` | array | List of follow-ups | | `follow_ups` | array | List of follow-ups |
| ↳ `id` | string | User ID | | ↳ `id` | string | Follow-up ID |
| ↳ `title` | string | Follow-up title | | ↳ `title` | string | Follow-up title |
| ↳ `description` | string | Priority description | | ↳ `description` | string | Follow-up description |
| ↳ `assignee` | object | Assigned user | | ↳ `assignee` | object | Assigned user |
| ↳ `id` | string | User ID | | ↳ `id` | string | User ID |
| ↳ `name` | string | User name | | ↳ `name` | string | User name |
| ↳ `email` | string | User email | | ↳ `email` | string | User email |
| ↳ `name` | string | User name |
| ↳ `email` | string | User email |
| ↳ `status` | string | Follow-up status | | ↳ `status` | string | Follow-up status |
| ↳ `priority` | object | Follow-up priority | | ↳ `priority` | object | Follow-up priority |
| ↳ `id` | string | Priority ID | | ↳ `id` | string | Priority ID |
| ↳ `name` | string | Priority name | | ↳ `name` | string | Priority name |
| ↳ `description` | string | Priority description | | ↳ `description` | string | Priority description |
| ↳ `rank` | number | Priority rank | | ↳ `rank` | number | Priority rank |
| ↳ `rank` | number | Priority rank |
| ↳ `created_at` | string | Creation timestamp | | ↳ `created_at` | string | Creation timestamp |
| ↳ `updated_at` | string | Last update timestamp | | ↳ `updated_at` | string | Last update timestamp |
| ↳ `incident_id` | string | Associated incident ID | | ↳ `incident_id` | string | Associated incident ID |
@@ -359,9 +338,6 @@ List follow-ups from incident.io. Optionally filter by incident ID.
| ↳ `provider` | string | External provider name | | ↳ `provider` | string | External provider name |
| ↳ `issue_name` | string | External issue name or ID | | ↳ `issue_name` | string | External issue name or ID |
| ↳ `issue_permalink` | string | Permalink to external issue | | ↳ `issue_permalink` | string | Permalink to external issue |
| ↳ `provider` | string | External provider name |
| ↳ `issue_name` | string | External issue name or ID |
| ↳ `issue_permalink` | string | Permalink to external issue |
### `incidentio_follow_ups_show` ### `incidentio_follow_ups_show`
@@ -379,22 +355,19 @@ Get detailed information about a specific follow-up from incident.io.
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `follow_up` | object | Follow-up details | | `follow_up` | object | Follow-up details |
| ↳ `id` | string | User ID | | ↳ `id` | string | Follow-up ID |
| ↳ `title` | string | Follow-up title | | ↳ `title` | string | Follow-up title |
| ↳ `description` | string | Priority description | | ↳ `description` | string | Follow-up description |
| ↳ `assignee` | object | Assigned user | | ↳ `assignee` | object | Assigned user |
| ↳ `id` | string | User ID | | ↳ `id` | string | User ID |
| ↳ `name` | string | User name | | ↳ `name` | string | User name |
| ↳ `email` | string | User email | | ↳ `email` | string | User email |
| ↳ `name` | string | User name |
| ↳ `email` | string | User email |
| ↳ `status` | string | Follow-up status | | ↳ `status` | string | Follow-up status |
| ↳ `priority` | object | Follow-up priority | | ↳ `priority` | object | Follow-up priority |
| ↳ `id` | string | Priority ID | | ↳ `id` | string | Priority ID |
| ↳ `name` | string | Priority name | | ↳ `name` | string | Priority name |
| ↳ `description` | string | Priority description | | ↳ `description` | string | Priority description |
| ↳ `rank` | number | Priority rank | | ↳ `rank` | number | Priority rank |
| ↳ `rank` | number | Priority rank |
| ↳ `created_at` | string | Creation timestamp | | ↳ `created_at` | string | Creation timestamp |
| ↳ `updated_at` | string | Last update timestamp | | ↳ `updated_at` | string | Last update timestamp |
| ↳ `incident_id` | string | Associated incident ID | | ↳ `incident_id` | string | Associated incident ID |
@@ -408,9 +381,6 @@ Get detailed information about a specific follow-up from incident.io.
| ↳ `provider` | string | External provider name | | ↳ `provider` | string | External provider name |
| ↳ `issue_name` | string | External issue name or ID | | ↳ `issue_name` | string | External issue name or ID |
| ↳ `issue_permalink` | string | Permalink to external issue | | ↳ `issue_permalink` | string | Permalink to external issue |
| ↳ `provider` | string | External provider name |
| ↳ `issue_name` | string | External issue name or ID |
| ↳ `issue_permalink` | string | Permalink to external issue |
### `incidentio_users_list` ### `incidentio_users_list`
@@ -1089,25 +1059,21 @@ List all updates for a specific incident in incident.io
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `incident_updates` | array | List of incident updates | | `incident_updates` | array | List of incident updates |
| ↳ `id` | string | User ID | | ↳ `id` | string | The update ID |
| ↳ `incident_id` | string | The incident ID | | ↳ `incident_id` | string | The incident ID |
| ↳ `message` | string | The update message | | ↳ `message` | string | The update message |
| ↳ `new_severity` | object | New severity if changed | | ↳ `new_severity` | object | New severity if changed |
| ↳ `id` | string | Severity ID | | ↳ `id` | string | Severity ID |
| ↳ `name` | string | Severity name | | ↳ `name` | string | Severity name |
| ↳ `rank` | number | Severity rank | | ↳ `rank` | number | Severity rank |
| ↳ `name` | string | User name |
| ↳ `rank` | number | Severity rank |
| ↳ `new_status` | object | New status if changed | | ↳ `new_status` | object | New status if changed |
| ↳ `id` | string | Status ID | | ↳ `id` | string | Status ID |
| ↳ `name` | string | Status name | | ↳ `name` | string | Status name |
| ↳ `category` | string | Status category | | ↳ `category` | string | Status category |
| ↳ `category` | string | Status category |
| ↳ `updater` | object | User who created the update | | ↳ `updater` | object | User who created the update |
| ↳ `id` | string | User ID | | ↳ `id` | string | User ID |
| ↳ `name` | string | User name | | ↳ `name` | string | User name |
| ↳ `email` | string | User email | | ↳ `email` | string | User email |
| ↳ `email` | string | User email |
| ↳ `created_at` | string | When the update was created | | ↳ `created_at` | string | When the update was created |
| ↳ `updated_at` | string | When the update was last modified | | ↳ `updated_at` | string | When the update was last modified |
| `pagination_meta` | object | Pagination information | | `pagination_meta` | object | Pagination information |
@@ -1134,14 +1100,12 @@ List all entries for a specific schedule in incident.io
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `schedule_entries` | array | List of schedule entries | | `schedule_entries` | array | List of schedule entries |
| ↳ `id` | string | User ID | | ↳ `id` | string | The entry ID |
| ↳ `schedule_id` | string | The schedule ID | | ↳ `schedule_id` | string | The schedule ID |
| ↳ `user` | object | User assigned to this entry | | ↳ `user` | object | User assigned to this entry |
| ↳ `id` | string | User ID | | ↳ `id` | string | User ID |
| ↳ `name` | string | User name | | ↳ `name` | string | User name |
| ↳ `email` | string | User email | | ↳ `email` | string | User email |
| ↳ `name` | string | User name |
| ↳ `email` | string | User email |
| ↳ `start_at` | string | When the entry starts | | ↳ `start_at` | string | When the entry starts |
| ↳ `end_at` | string | When the entry ends | | ↳ `end_at` | string | When the entry ends |
| ↳ `layer_id` | string | The schedule layer ID | | ↳ `layer_id` | string | The schedule layer ID |
@@ -1174,15 +1138,13 @@ Create a new schedule override in incident.io
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `override` | object | The created schedule override | | `override` | object | The created schedule override |
| ↳ `id` | string | User ID | | ↳ `id` | string | The override ID |
| ↳ `rotation_id` | string | The rotation ID | | ↳ `rotation_id` | string | The rotation ID |
| ↳ `schedule_id` | string | The schedule ID | | ↳ `schedule_id` | string | The schedule ID |
| ↳ `user` | object | User assigned to this override | | ↳ `user` | object | User assigned to this override |
| ↳ `id` | string | User ID | | ↳ `id` | string | User ID |
| ↳ `name` | string | User name | | ↳ `name` | string | User name |
| ↳ `email` | string | User email | | ↳ `email` | string | User email |
| ↳ `name` | string | User name |
| ↳ `email` | string | User email |
| ↳ `start_at` | string | When the override starts | | ↳ `start_at` | string | When the override starts |
| ↳ `end_at` | string | When the override ends | | ↳ `end_at` | string | When the override ends |
| ↳ `created_at` | string | When the override was created | | ↳ `created_at` | string | When the override was created |
@@ -1206,7 +1168,7 @@ Create a new escalation path in incident.io
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `escalation_path` | object | The created escalation path | | `escalation_path` | object | The created escalation path |
| ↳ `id` | string | Target ID | | ↳ `id` | string | The escalation path ID |
| ↳ `name` | string | The escalation path name | | ↳ `name` | string | The escalation path name |
| ↳ `path` | array | Array of escalation levels | | ↳ `path` | array | Array of escalation levels |
| ↳ `targets` | array | Targets for this level | | ↳ `targets` | array | Targets for this level |
@@ -1215,30 +1177,11 @@ Create a new escalation path in incident.io
| ↳ `schedule_id` | string | Schedule ID if type is schedule | | ↳ `schedule_id` | string | Schedule ID if type is schedule |
| ↳ `user_id` | string | User ID if type is user | | ↳ `user_id` | string | User ID if type is user |
| ↳ `urgency` | string | Urgency level | | ↳ `urgency` | string | Urgency level |
| ↳ `id` | string | Target ID |
| ↳ `type` | string | Target type |
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
| ↳ `user_id` | string | User ID if type is user |
| ↳ `urgency` | string | Urgency level |
| ↳ `time_to_ack_seconds` | number | Time to acknowledge in seconds | | ↳ `time_to_ack_seconds` | number | Time to acknowledge in seconds |
| ↳ `targets` | array | Targets for this level |
| ↳ `id` | string | Target ID |
| ↳ `type` | string | Target type |
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
| ↳ `user_id` | string | User ID if type is user |
| ↳ `urgency` | string | Urgency level |
| ↳ `type` | string | Target type |
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
| ↳ `user_id` | string | User ID if type is user |
| ↳ `urgency` | string | Urgency level |
| ↳ `time_to_ack_seconds` | number | Time to acknowledge in seconds |
| ↳ `working_hours` | array | Working hours configuration | | ↳ `working_hours` | array | Working hours configuration |
| ↳ `weekday` | string | Day of week | | ↳ `weekday` | string | Day of week |
| ↳ `start_time` | string | Start time | | ↳ `start_time` | string | Start time |
| ↳ `end_time` | string | End time | | ↳ `end_time` | string | End time |
| ↳ `weekday` | string | Day of week |
| ↳ `start_time` | string | Start time |
| ↳ `end_time` | string | End time |
| ↳ `created_at` | string | When the path was created | | ↳ `created_at` | string | When the path was created |
| ↳ `updated_at` | string | When the path was last updated | | ↳ `updated_at` | string | When the path was last updated |
@@ -1258,7 +1201,7 @@ Get details of a specific escalation path in incident.io
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `escalation_path` | object | The escalation path details | | `escalation_path` | object | The escalation path details |
| ↳ `id` | string | Target ID | | ↳ `id` | string | The escalation path ID |
| ↳ `name` | string | The escalation path name | | ↳ `name` | string | The escalation path name |
| ↳ `path` | array | Array of escalation levels | | ↳ `path` | array | Array of escalation levels |
| ↳ `targets` | array | Targets for this level | | ↳ `targets` | array | Targets for this level |
@@ -1267,30 +1210,11 @@ Get details of a specific escalation path in incident.io
| ↳ `schedule_id` | string | Schedule ID if type is schedule | | ↳ `schedule_id` | string | Schedule ID if type is schedule |
| ↳ `user_id` | string | User ID if type is user | | ↳ `user_id` | string | User ID if type is user |
| ↳ `urgency` | string | Urgency level | | ↳ `urgency` | string | Urgency level |
| ↳ `id` | string | Target ID |
| ↳ `type` | string | Target type |
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
| ↳ `user_id` | string | User ID if type is user |
| ↳ `urgency` | string | Urgency level |
| ↳ `time_to_ack_seconds` | number | Time to acknowledge in seconds | | ↳ `time_to_ack_seconds` | number | Time to acknowledge in seconds |
| ↳ `targets` | array | Targets for this level |
| ↳ `id` | string | Target ID |
| ↳ `type` | string | Target type |
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
| ↳ `user_id` | string | User ID if type is user |
| ↳ `urgency` | string | Urgency level |
| ↳ `type` | string | Target type |
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
| ↳ `user_id` | string | User ID if type is user |
| ↳ `urgency` | string | Urgency level |
| ↳ `time_to_ack_seconds` | number | Time to acknowledge in seconds |
| ↳ `working_hours` | array | Working hours configuration | | ↳ `working_hours` | array | Working hours configuration |
| ↳ `weekday` | string | Day of week | | ↳ `weekday` | string | Day of week |
| ↳ `start_time` | string | Start time | | ↳ `start_time` | string | Start time |
| ↳ `end_time` | string | End time | | ↳ `end_time` | string | End time |
| ↳ `weekday` | string | Day of week |
| ↳ `start_time` | string | Start time |
| ↳ `end_time` | string | End time |
| ↳ `created_at` | string | When the path was created | | ↳ `created_at` | string | When the path was created |
| ↳ `updated_at` | string | When the path was last updated | | ↳ `updated_at` | string | When the path was last updated |
@@ -1313,7 +1237,7 @@ Update an existing escalation path in incident.io
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `escalation_path` | object | The updated escalation path | | `escalation_path` | object | The updated escalation path |
| ↳ `id` | string | Target ID | | ↳ `id` | string | The escalation path ID |
| ↳ `name` | string | The escalation path name | | ↳ `name` | string | The escalation path name |
| ↳ `path` | array | Array of escalation levels | | ↳ `path` | array | Array of escalation levels |
| ↳ `targets` | array | Targets for this level | | ↳ `targets` | array | Targets for this level |
@@ -1322,30 +1246,11 @@ Update an existing escalation path in incident.io
| ↳ `schedule_id` | string | Schedule ID if type is schedule | | ↳ `schedule_id` | string | Schedule ID if type is schedule |
| ↳ `user_id` | string | User ID if type is user | | ↳ `user_id` | string | User ID if type is user |
| ↳ `urgency` | string | Urgency level | | ↳ `urgency` | string | Urgency level |
| ↳ `id` | string | Target ID |
| ↳ `type` | string | Target type |
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
| ↳ `user_id` | string | User ID if type is user |
| ↳ `urgency` | string | Urgency level |
| ↳ `time_to_ack_seconds` | number | Time to acknowledge in seconds | | ↳ `time_to_ack_seconds` | number | Time to acknowledge in seconds |
| ↳ `targets` | array | Targets for this level |
| ↳ `id` | string | Target ID |
| ↳ `type` | string | Target type |
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
| ↳ `user_id` | string | User ID if type is user |
| ↳ `urgency` | string | Urgency level |
| ↳ `type` | string | Target type |
| ↳ `schedule_id` | string | Schedule ID if type is schedule |
| ↳ `user_id` | string | User ID if type is user |
| ↳ `urgency` | string | Urgency level |
| ↳ `time_to_ack_seconds` | number | Time to acknowledge in seconds |
| ↳ `working_hours` | array | Working hours configuration | | ↳ `working_hours` | array | Working hours configuration |
| ↳ `weekday` | string | Day of week | | ↳ `weekday` | string | Day of week |
| ↳ `start_time` | string | Start time | | ↳ `start_time` | string | Start time |
| ↳ `end_time` | string | End time | | ↳ `end_time` | string | End time |
| ↳ `weekday` | string | Day of week |
| ↳ `start_time` | string | Start time |
| ↳ `end_time` | string | End time |
| ↳ `created_at` | string | When the path was created | | ↳ `created_at` | string | When the path was created |
| ↳ `updated_at` | string | When the path was last updated | | ↳ `updated_at` | string | When the path was last updated |

View File

@@ -62,7 +62,7 @@ Create a new contact in Intercom with email, external_id, or role. Returns API-a
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `contact` | object | Created contact object | | `contact` | object | Created contact object |
| ↳ `id` | string | Unique identifier for the contact | | ↳ `id` | string | Unique identifier for the contact |
| ↳ `type` | string | List type | | ↳ `type` | string | Object type \(contact\) |
| ↳ `role` | string | Role of the contact \(user or lead\) | | ↳ `role` | string | Role of the contact \(user or lead\) |
| ↳ `email` | string | Email address of the contact | | ↳ `email` | string | Email address of the contact |
| ↳ `phone` | string | Phone number of the contact | | ↳ `phone` | string | Phone number of the contact |
@@ -82,10 +82,6 @@ Create a new contact in Intercom with email, external_id, or role. Returns API-a
| ↳ `data` | array | Array of tag objects | | ↳ `data` | array | Array of tag objects |
| ↳ `has_more` | boolean | Whether there are more tags | | ↳ `has_more` | boolean | Whether there are more tags |
| ↳ `total_count` | number | Total number of tags | | ↳ `total_count` | number | Total number of tags |
| ↳ `url` | string | URL to fetch companies |
| ↳ `data` | array | Array of social profile objects |
| ↳ `has_more` | boolean | Whether there are more companies |
| ↳ `total_count` | number | Total number of companies |
| ↳ `notes` | object | Notes associated with the contact | | ↳ `notes` | object | Notes associated with the contact |
| ↳ `type` | string | List type | | ↳ `type` | string | List type |
| ↳ `url` | string | URL to fetch notes | | ↳ `url` | string | URL to fetch notes |
@@ -105,11 +101,6 @@ Create a new contact in Intercom with email, external_id, or role. Returns API-a
| ↳ `country` | string | Country | | ↳ `country` | string | Country |
| ↳ `country_code` | string | Country code | | ↳ `country_code` | string | Country code |
| ↳ `continent_code` | string | Continent code | | ↳ `continent_code` | string | Continent code |
| ↳ `city` | string | City |
| ↳ `region` | string | Region/State |
| ↳ `country` | string | Country |
| ↳ `country_code` | string | Country code |
| ↳ `continent_code` | string | Continent code |
| ↳ `social_profiles` | object | Social profiles of the contact | | ↳ `social_profiles` | object | Social profiles of the contact |
| ↳ `type` | string | List type | | ↳ `type` | string | List type |
| ↳ `data` | array | Array of social profile objects | | ↳ `data` | array | Array of social profile objects |
@@ -323,7 +314,7 @@ Create or update a company in Intercom
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `company` | object | Created or updated company object | | `company` | object | Created or updated company object |
| ↳ `id` | string | Unique identifier for the company | | ↳ `id` | string | Unique identifier for the company |
| ↳ `type` | string | Segment list type | | ↳ `type` | string | Object type \(company\) |
| ↳ `app_id` | string | Intercom app ID | | ↳ `app_id` | string | Intercom app ID |
| ↳ `company_id` | string | Your unique identifier for the company | | ↳ `company_id` | string | Your unique identifier for the company |
| ↳ `name` | string | Name of the company | | ↳ `name` | string | Name of the company |
@@ -338,8 +329,12 @@ Create or update a company in Intercom
| ↳ `updated_at` | number | Unix timestamp when company was last updated | | ↳ `updated_at` | number | Unix timestamp when company was last updated |
| ↳ `remote_created_at` | number | Unix timestamp when company was created by you | | ↳ `remote_created_at` | number | Unix timestamp when company was created by you |
| ↳ `custom_attributes` | object | Custom attributes set on the company | | ↳ `custom_attributes` | object | Custom attributes set on the company |
| ↳ `tags` | array | Array of tag objects | | ↳ `tags` | object | Tags associated with the company |
| ↳ `segments` | array | Array of segment objects | | ↳ `type` | string | Tag list type |
| ↳ `tags` | array | Array of tag objects |
| ↳ `segments` | object | Segments the company belongs to |
| ↳ `type` | string | Segment list type |
| ↳ `segments` | array | Array of segment objects |
| `companyId` | string | ID of the created/updated company | | `companyId` | string | ID of the created/updated company |
### `intercom_get_company` ### `intercom_get_company`
@@ -647,6 +642,42 @@ Retrieve a single ticket by ID from Intercom. Returns API-aligned fields only.
| `ticketId` | string | ID of the retrieved ticket | | `ticketId` | string | ID of the retrieved ticket |
| `success` | boolean | Operation success status | | `success` | boolean | Operation success status |
### `intercom_update_ticket`
Update a ticket in Intercom (change state, assignment, attributes)
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `ticketId` | string | Yes | The ID of the ticket to update |
| `ticket_attributes` | string | No | JSON object with ticket attributes \(e.g., \{"_default_title_":"New Title","_default_description_":"Updated description"\}\) |
| `open` | boolean | No | Set to false to close the ticket, true to keep it open |
| `is_shared` | boolean | No | Whether the ticket is visible to users |
| `snoozed_until` | number | No | Unix timestamp for when the ticket should reopen |
| `admin_id` | string | No | The ID of the admin performing the update \(needed for workflows and attribution\) |
| `assignee_id` | string | No | The ID of the admin or team to assign the ticket to. Set to "0" to unassign. |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `ticket` | object | The updated ticket object |
| ↳ `id` | string | Unique identifier for the ticket |
| ↳ `type` | string | Object type \(ticket\) |
| ↳ `ticket_id` | string | Ticket ID shown in Intercom UI |
| ↳ `ticket_state` | string | State of the ticket |
| ↳ `ticket_attributes` | object | Attributes of the ticket |
| ↳ `open` | boolean | Whether the ticket is open |
| ↳ `is_shared` | boolean | Whether the ticket is visible to users |
| ↳ `snoozed_until` | number | Unix timestamp when ticket will reopen |
| ↳ `admin_assignee_id` | string | ID of assigned admin |
| ↳ `team_assignee_id` | string | ID of assigned team |
| ↳ `created_at` | number | Unix timestamp when ticket was created |
| ↳ `updated_at` | number | Unix timestamp when ticket was last updated |
| `ticketId` | string | ID of the updated ticket |
| `ticket_state` | string | Current state of the ticket |
### `intercom_create_message` ### `intercom_create_message`
Create and send a new admin-initiated message in Intercom. Returns API-aligned fields only. Create and send a new admin-initiated message in Intercom. Returns API-aligned fields only.
@@ -680,4 +711,340 @@ Create and send a new admin-initiated message in Intercom. Returns API-aligned f
| `messageId` | string | ID of the created message | | `messageId` | string | ID of the created message |
| `success` | boolean | Operation success status | | `success` | boolean | Operation success status |
### `intercom_list_admins`
Fetch a list of all admins for the workspace
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `admins` | array | Array of admin objects |
| ↳ `id` | string | Unique identifier for the admin |
| ↳ `type` | string | Object type \(admin\) |
| ↳ `name` | string | Name of the admin |
| ↳ `email` | string | Email of the admin |
| ↳ `job_title` | string | Job title of the admin |
| ↳ `away_mode_enabled` | boolean | Whether admin is in away mode |
| ↳ `away_mode_reassign` | boolean | Whether to reassign conversations when away |
| ↳ `has_inbox_seat` | boolean | Whether admin has a paid inbox seat |
| ↳ `team_ids` | array | List of team IDs the admin belongs to |
| ↳ `avatar` | object | Avatar information |
| ↳ `email_verified` | boolean | Whether email is verified |
| `type` | string | Object type \(admin.list\) |
### `intercom_close_conversation`
Close a conversation in Intercom
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `conversationId` | string | Yes | The ID of the conversation to close |
| `admin_id` | string | Yes | The ID of the admin performing the action |
| `body` | string | No | Optional closing message to add to the conversation |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `conversation` | object | The closed conversation object |
| ↳ `id` | string | Unique identifier for the conversation |
| ↳ `type` | string | Object type \(conversation\) |
| ↳ `state` | string | State of the conversation \(closed\) |
| ↳ `open` | boolean | Whether the conversation is open \(false\) |
| ↳ `read` | boolean | Whether the conversation has been read |
| ↳ `created_at` | number | Unix timestamp when conversation was created |
| ↳ `updated_at` | number | Unix timestamp when conversation was last updated |
| `conversationId` | string | ID of the closed conversation |
| `state` | string | State of the conversation \(closed\) |
### `intercom_open_conversation`
Open a closed or snoozed conversation in Intercom
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `conversationId` | string | Yes | The ID of the conversation to open |
| `admin_id` | string | Yes | The ID of the admin performing the action |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `conversation` | object | The opened conversation object |
| ↳ `id` | string | Unique identifier for the conversation |
| ↳ `type` | string | Object type \(conversation\) |
| ↳ `state` | string | State of the conversation \(open\) |
| ↳ `open` | boolean | Whether the conversation is open \(true\) |
| ↳ `read` | boolean | Whether the conversation has been read |
| ↳ `created_at` | number | Unix timestamp when conversation was created |
| ↳ `updated_at` | number | Unix timestamp when conversation was last updated |
| `conversationId` | string | ID of the opened conversation |
| `state` | string | State of the conversation \(open\) |
### `intercom_snooze_conversation`
Snooze a conversation to reopen at a future time
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `conversationId` | string | Yes | The ID of the conversation to snooze |
| `admin_id` | string | Yes | The ID of the admin performing the action |
| `snoozed_until` | number | Yes | Unix timestamp for when the conversation should reopen |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `conversation` | object | The snoozed conversation object |
| ↳ `id` | string | Unique identifier for the conversation |
| ↳ `type` | string | Object type \(conversation\) |
| ↳ `state` | string | State of the conversation \(snoozed\) |
| ↳ `open` | boolean | Whether the conversation is open |
| ↳ `snoozed_until` | number | Unix timestamp when conversation will reopen |
| ↳ `created_at` | number | Unix timestamp when conversation was created |
| ↳ `updated_at` | number | Unix timestamp when conversation was last updated |
| `conversationId` | string | ID of the snoozed conversation |
| `state` | string | State of the conversation \(snoozed\) |
| `snoozed_until` | number | Unix timestamp when conversation will reopen |
### `intercom_assign_conversation`
Assign a conversation to an admin or team in Intercom
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `conversationId` | string | Yes | The ID of the conversation to assign |
| `admin_id` | string | Yes | The ID of the admin performing the assignment |
| `assignee_id` | string | Yes | The ID of the admin or team to assign the conversation to. Set to "0" to unassign. |
| `body` | string | No | Optional message to add when assigning \(e.g., "Passing to the support team"\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `conversation` | object | The assigned conversation object |
| ↳ `id` | string | Unique identifier for the conversation |
| ↳ `type` | string | Object type \(conversation\) |
| ↳ `state` | string | State of the conversation |
| ↳ `open` | boolean | Whether the conversation is open |
| ↳ `admin_assignee_id` | number | ID of the assigned admin |
| ↳ `team_assignee_id` | string | ID of the assigned team |
| ↳ `created_at` | number | Unix timestamp when conversation was created |
| ↳ `updated_at` | number | Unix timestamp when conversation was last updated |
| `conversationId` | string | ID of the assigned conversation |
| `admin_assignee_id` | number | ID of the assigned admin |
| `team_assignee_id` | string | ID of the assigned team |
### `intercom_list_tags`
Fetch a list of all tags in the workspace
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `tags` | array | Array of tag objects |
| ↳ `id` | string | Unique identifier for the tag |
| ↳ `type` | string | Object type \(tag\) |
| ↳ `name` | string | Name of the tag |
| `type` | string | Object type \(list\) |
### `intercom_create_tag`
Create a new tag or update an existing tag name
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `name` | string | Yes | The name of the tag. Will create a new tag if not found, or update the name if id is provided. |
| `id` | string | No | The ID of an existing tag to update. Omit to create a new tag. |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `id` | string | Unique identifier for the tag |
| `name` | string | Name of the tag |
| `type` | string | Object type \(tag\) |
### `intercom_tag_contact`
Add a tag to a specific contact
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `contactId` | string | Yes | The ID of the contact to tag |
| `tagId` | string | Yes | The ID of the tag to apply |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `id` | string | Unique identifier for the tag |
| `name` | string | Name of the tag |
| `type` | string | Object type \(tag\) |
### `intercom_untag_contact`
Remove a tag from a specific contact
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `contactId` | string | Yes | The ID of the contact to untag |
| `tagId` | string | Yes | The ID of the tag to remove |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `id` | string | Unique identifier for the tag that was removed |
| `name` | string | Name of the tag that was removed |
| `type` | string | Object type \(tag\) |
### `intercom_tag_conversation`
Add a tag to a specific conversation
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `conversationId` | string | Yes | The ID of the conversation to tag |
| `tagId` | string | Yes | The ID of the tag to apply |
| `admin_id` | string | Yes | The ID of the admin applying the tag |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `id` | string | Unique identifier for the tag |
| `name` | string | Name of the tag |
| `type` | string | Object type \(tag\) |
### `intercom_create_note`
Add a note to a specific contact
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `contactId` | string | Yes | The ID of the contact to add the note to |
| `body` | string | Yes | The text content of the note |
| `admin_id` | string | No | The ID of the admin creating the note |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `id` | string | Unique identifier for the note |
| `body` | string | The text content of the note |
| `created_at` | number | Unix timestamp when the note was created |
| `type` | string | Object type \(note\) |
| `author` | object | The admin who created the note |
| ↳ `type` | string | Author type \(admin\) |
| ↳ `id` | string | Author ID |
| ↳ `name` | string | Author name |
| ↳ `email` | string | Author email |
| `contact` | object | The contact the note was created for |
| ↳ `type` | string | Contact type |
| ↳ `id` | string | Contact ID |
### `intercom_create_event`
Track a custom event for a contact in Intercom
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `event_name` | string | Yes | The name of the event \(e.g., "order-completed"\). Use past-tense verb-noun format for readability. |
| `created_at` | number | No | Unix timestamp for when the event occurred. Strongly recommended for uniqueness. |
| `user_id` | string | No | Your identifier for the user \(external_id\) |
| `email` | string | No | Email address of the user. Use only if your app uses email to uniquely identify users. |
| `id` | string | No | The Intercom contact ID |
| `metadata` | string | No | JSON object with up to 10 metadata key-value pairs about the event \(e.g., \{"order_value": 99.99\}\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `accepted` | boolean | Whether the event was accepted \(202 Accepted\) |
### `intercom_attach_contact_to_company`
Attach a contact to a company in Intercom
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `contactId` | string | Yes | The ID of the contact to attach to the company |
| `companyId` | string | Yes | The ID of the company to attach the contact to |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `company` | object | The company object the contact was attached to |
| ↳ `id` | string | Unique identifier for the company |
| ↳ `type` | string | Object type \(company\) |
| ↳ `company_id` | string | The company_id you defined |
| ↳ `name` | string | Name of the company |
| ↳ `created_at` | number | Unix timestamp when company was created |
| ↳ `updated_at` | number | Unix timestamp when company was updated |
| ↳ `user_count` | number | Number of users in the company |
| ↳ `session_count` | number | Number of sessions |
| ↳ `monthly_spend` | number | Monthly spend amount |
| ↳ `plan` | object | Company plan details |
| `companyId` | string | ID of the company |
| `name` | string | Name of the company |
### `intercom_detach_contact_from_company`
Remove a contact from a company in Intercom
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `contactId` | string | Yes | The ID of the contact to detach from the company |
| `companyId` | string | Yes | The ID of the company to detach the contact from |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `company` | object | The company object the contact was detached from |
| ↳ `id` | string | Unique identifier for the company |
| ↳ `type` | string | Object type \(company\) |
| ↳ `company_id` | string | The company_id you defined |
| ↳ `name` | string | Name of the company |
| `companyId` | string | ID of the company |
| `name` | string | Name of the company |

View File

@@ -6,7 +6,7 @@ description: Access prediction markets and trade on Kalshi
import { BlockInfoCard } from "@/components/ui/block-info-card" import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard <BlockInfoCard
type="kalshi" type="kalshi_v2"
color="#09C285" color="#09C285"
/> />
@@ -36,7 +36,7 @@ Integrate Kalshi prediction markets into the workflow. Can get markets, market,
### `kalshi_get_markets` ### `kalshi_get_markets`
Retrieve a list of prediction markets from Kalshi with optional filtering Retrieve a list of prediction markets from Kalshi with all filtering options (V2 - full API response)
#### Input #### Input
@@ -52,12 +52,12 @@ Retrieve a list of prediction markets from Kalshi with optional filtering
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `markets` | array | Array of market objects | | `markets` | array | Array of market objects with all API fields |
| `paging` | object | Pagination cursor for fetching more results | | `cursor` | string | Pagination cursor for fetching more results |
### `kalshi_get_market` ### `kalshi_get_market`
Retrieve details of a specific prediction market by ticker Retrieve details of a specific prediction market by ticker (V2 - full API response)
#### Input #### Input
@@ -69,11 +69,62 @@ Retrieve details of a specific prediction market by ticker
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `market` | object | Market object with details | | `market` | object | Market object with all API fields |
| ↳ `ticker` | string | Market ticker |
| ↳ `event_ticker` | string | Event ticker |
| ↳ `market_type` | string | Market type |
| ↳ `title` | string | Market title |
| ↳ `subtitle` | string | Market subtitle |
| ↳ `yes_sub_title` | string | Yes outcome subtitle |
| ↳ `no_sub_title` | string | No outcome subtitle |
| ↳ `open_time` | string | Market open time |
| ↳ `close_time` | string | Market close time |
| ↳ `expected_expiration_time` | string | Expected expiration time |
| ↳ `expiration_time` | string | Expiration time |
| ↳ `latest_expiration_time` | string | Latest expiration time |
| ↳ `settlement_timer_seconds` | number | Settlement timer in seconds |
| ↳ `status` | string | Market status |
| ↳ `response_price_units` | string | Response price units |
| ↳ `notional_value` | number | Notional value |
| ↳ `tick_size` | number | Tick size |
| ↳ `yes_bid` | number | Current yes bid price |
| ↳ `yes_ask` | number | Current yes ask price |
| ↳ `no_bid` | number | Current no bid price |
| ↳ `no_ask` | number | Current no ask price |
| ↳ `last_price` | number | Last trade price |
| ↳ `previous_yes_bid` | number | Previous yes bid |
| ↳ `previous_yes_ask` | number | Previous yes ask |
| ↳ `previous_price` | number | Previous price |
| ↳ `volume` | number | Total volume |
| ↳ `volume_24h` | number | 24-hour volume |
| ↳ `liquidity` | number | Market liquidity |
| ↳ `open_interest` | number | Open interest |
| ↳ `result` | string | Market result |
| ↳ `cap_strike` | number | Cap strike |
| ↳ `floor_strike` | number | Floor strike |
| ↳ `can_close_early` | boolean | Can close early |
| ↳ `expiration_value` | string | Expiration value |
| ↳ `category` | string | Market category |
| ↳ `risk_limit_cents` | number | Risk limit in cents |
| ↳ `strike_type` | string | Strike type |
| ↳ `rules_primary` | string | Primary rules |
| ↳ `rules_secondary` | string | Secondary rules |
| ↳ `settlement_source_url` | string | Settlement source URL |
| ↳ `custom_strike` | object | Custom strike object |
| ↳ `underlying` | string | Underlying asset |
| ↳ `settlement_value` | number | Settlement value |
| ↳ `cfd_contract_size` | number | CFD contract size |
| ↳ `yes_fee_fp` | number | Yes fee \(fixed-point\) |
| ↳ `no_fee_fp` | number | No fee \(fixed-point\) |
| ↳ `last_price_fp` | number | Last price \(fixed-point\) |
| ↳ `yes_bid_fp` | number | Yes bid \(fixed-point\) |
| ↳ `yes_ask_fp` | number | Yes ask \(fixed-point\) |
| ↳ `no_bid_fp` | number | No bid \(fixed-point\) |
| ↳ `no_ask_fp` | number | No ask \(fixed-point\) |
### `kalshi_get_events` ### `kalshi_get_events`
Retrieve a list of events from Kalshi with optional filtering Retrieve a list of events from Kalshi with optional filtering (V2 - exact API response)
#### Input #### Input
@@ -90,11 +141,12 @@ Retrieve a list of events from Kalshi with optional filtering
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `events` | array | Array of event objects | | `events` | array | Array of event objects |
| `paging` | object | Pagination cursor for fetching more results | | `milestones` | array | Array of milestone objects \(if requested\) |
| `cursor` | string | Pagination cursor for fetching more results |
### `kalshi_get_event` ### `kalshi_get_event`
Retrieve details of a specific event by ticker Retrieve details of a specific event by ticker (V2 - exact API response)
#### Input #### Input
@@ -107,11 +159,23 @@ Retrieve details of a specific event by ticker
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `event` | object | Event object with details | | `event` | object | Event object with full details matching Kalshi API response |
| ↳ `event_ticker` | string | Event ticker |
| ↳ `series_ticker` | string | Series ticker |
| ↳ `title` | string | Event title |
| ↳ `sub_title` | string | Event subtitle |
| ↳ `mutually_exclusive` | boolean | Mutually exclusive markets |
| ↳ `category` | string | Event category |
| ↳ `collateral_return_type` | string | Collateral return type |
| ↳ `strike_date` | string | Strike date |
| ↳ `strike_period` | string | Strike period |
| ↳ `available_on_brokers` | boolean | Available on brokers |
| ↳ `product_metadata` | object | Product metadata |
| ↳ `markets` | array | Nested markets \(if requested\) |
### `kalshi_get_balance` ### `kalshi_get_balance`
Retrieve your account balance and portfolio value from Kalshi Retrieve your account balance and portfolio value from Kalshi (V2 - exact API response)
#### Input #### Input
@@ -125,11 +189,12 @@ Retrieve your account balance and portfolio value from Kalshi
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `balance` | number | Account balance in cents | | `balance` | number | Account balance in cents |
| `portfolioValue` | number | Portfolio value in cents | | `portfolio_value` | number | Portfolio value in cents |
| `updated_ts` | number | Unix timestamp of last update \(milliseconds\) |
### `kalshi_get_positions` ### `kalshi_get_positions`
Retrieve your open positions from Kalshi Retrieve your open positions from Kalshi (V2 - exact API response)
#### Input #### Input
@@ -147,12 +212,13 @@ Retrieve your open positions from Kalshi
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `positions` | array | Array of position objects | | `market_positions` | array | Array of market position objects |
| `paging` | object | Pagination cursor for fetching more results | | `event_positions` | array | Array of event position objects |
| `cursor` | string | Pagination cursor for fetching more results |
### `kalshi_get_orders` ### `kalshi_get_orders`
Retrieve your orders from Kalshi with optional filtering Retrieve your orders from Kalshi with optional filtering (V2 with full API response)
#### Input #### Input
@@ -170,12 +236,12 @@ Retrieve your orders from Kalshi with optional filtering
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `orders` | array | Array of order objects | | `orders` | array | Array of order objects with full API response fields |
| `paging` | object | Pagination cursor for fetching more results | | `cursor` | string | Pagination cursor for fetching more results |
### `kalshi_get_order` ### `kalshi_get_order`
Retrieve details of a specific order by ID from Kalshi Retrieve details of a specific order by ID from Kalshi (V2 with full API response)
#### Input #### Input
@@ -189,11 +255,44 @@ Retrieve details of a specific order by ID from Kalshi
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `order` | object | Order object with details | | `order` | object | Order object with full API response fields |
| ↳ `order_id` | string | Order ID |
| ↳ `user_id` | string | User ID |
| ↳ `client_order_id` | string | Client order ID |
| ↳ `ticker` | string | Market ticker |
| ↳ `side` | string | Order side \(yes/no\) |
| ↳ `action` | string | Action \(buy/sell\) |
| ↳ `type` | string | Order type \(limit/market\) |
| ↳ `status` | string | Order status \(resting/canceled/executed\) |
| ↳ `yes_price` | number | Yes price in cents |
| ↳ `no_price` | number | No price in cents |
| ↳ `yes_price_dollars` | string | Yes price in dollars |
| ↳ `no_price_dollars` | string | No price in dollars |
| ↳ `fill_count` | number | Filled contract count |
| ↳ `fill_count_fp` | string | Filled count \(fixed-point\) |
| ↳ `remaining_count` | number | Remaining contracts |
| ↳ `remaining_count_fp` | string | Remaining count \(fixed-point\) |
| ↳ `initial_count` | number | Initial contract count |
| ↳ `initial_count_fp` | string | Initial count \(fixed-point\) |
| ↳ `taker_fees` | number | Taker fees in cents |
| ↳ `maker_fees` | number | Maker fees in cents |
| ↳ `taker_fees_dollars` | string | Taker fees in dollars |
| ↳ `maker_fees_dollars` | string | Maker fees in dollars |
| ↳ `taker_fill_cost` | number | Taker fill cost in cents |
| ↳ `maker_fill_cost` | number | Maker fill cost in cents |
| ↳ `taker_fill_cost_dollars` | string | Taker fill cost in dollars |
| ↳ `maker_fill_cost_dollars` | string | Maker fill cost in dollars |
| ↳ `queue_position` | number | Queue position \(deprecated\) |
| ↳ `expiration_time` | string | Order expiration time |
| ↳ `created_time` | string | Order creation time |
| ↳ `last_update_time` | string | Last update time |
| ↳ `self_trade_prevention_type` | string | Self-trade prevention type |
| ↳ `order_group_id` | string | Order group ID |
| ↳ `cancel_order_on_pause` | boolean | Cancel on market pause |
### `kalshi_get_orderbook` ### `kalshi_get_orderbook`
Retrieve the orderbook (yes and no bids) for a specific market Retrieve the orderbook (yes and no bids) for a specific market (V2 - includes depth and fp fields)
#### Input #### Input
@@ -205,11 +304,18 @@ Retrieve the orderbook (yes and no bids) for a specific market
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `orderbook` | object | Orderbook with yes/no bids and asks | | `orderbook` | object | Orderbook with yes/no bids \(legacy integer counts\) |
| ↳ `yes` | array | Yes side bids as tuples \[price_cents, count\] |
| ↳ `no` | array | No side bids as tuples \[price_cents, count\] |
| ↳ `yes_dollars` | array | Yes side bids as tuples \[dollars_string, count\] |
| ↳ `no_dollars` | array | No side bids as tuples \[dollars_string, count\] |
| `orderbook_fp` | object | Orderbook with fixed-point counts \(preferred\) |
| ↳ `yes_dollars` | array | Yes side bids as tuples \[dollars_string, fp_count_string\] |
| ↳ `no_dollars` | array | No side bids as tuples \[dollars_string, fp_count_string\] |
### `kalshi_get_trades` ### `kalshi_get_trades`
Retrieve recent trades across all markets Retrieve recent trades with additional filtering options (V2 - includes trade_id and count_fp)
#### Input #### Input
@@ -222,12 +328,12 @@ Retrieve recent trades across all markets
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `trades` | array | Array of trade objects | | `trades` | array | Array of trade objects with trade_id and count_fp |
| `paging` | object | Pagination cursor for fetching more results | | `cursor` | string | Pagination cursor for fetching more results |
### `kalshi_get_candlesticks` ### `kalshi_get_candlesticks`
Retrieve OHLC candlestick data for a specific market Retrieve OHLC candlestick data for a specific market (V2 - full API response)
#### Input #### Input
@@ -243,7 +349,8 @@ Retrieve OHLC candlestick data for a specific market
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `candlesticks` | array | Array of OHLC candlestick data | | `ticker` | string | Market ticker |
| `candlesticks` | array | Array of OHLC candlestick data with nested bid/ask/price objects |
### `kalshi_get_fills` ### `kalshi_get_fills`
@@ -266,12 +373,12 @@ Retrieve your portfolio
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `fills` | array | Array of fill/trade objects | | `fills` | array | Array of fill/trade objects with all API fields |
| `paging` | object | Pagination cursor for fetching more results | | `cursor` | string | Pagination cursor for fetching more results |
### `kalshi_get_series_by_ticker` ### `kalshi_get_series_by_ticker`
Retrieve details of a specific market series by ticker Retrieve details of a specific market series by ticker (V2 - exact API response)
#### Input #### Input
@@ -283,11 +390,25 @@ Retrieve details of a specific market series by ticker
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `series` | object | Series object with details | | `series` | object | Series object with full details matching Kalshi API response |
| ↳ `ticker` | string | Series ticker |
| ↳ `title` | string | Series title |
| ↳ `frequency` | string | Event frequency |
| ↳ `category` | string | Series category |
| ↳ `tags` | array | Series tags |
| ↳ `settlement_sources` | array | Settlement sources |
| ↳ `contract_url` | string | Contract URL |
| ↳ `contract_terms_url` | string | Contract terms URL |
| ↳ `fee_type` | string | Fee type |
| ↳ `fee_multiplier` | number | Fee multiplier |
| ↳ `additional_prohibitions` | array | Additional prohibitions |
| ↳ `product_metadata` | object | Product metadata |
| ↳ `volume` | number | Series volume |
| ↳ `volume_fp` | number | Volume \(fixed-point\) |
### `kalshi_get_exchange_status` ### `kalshi_get_exchange_status`
Retrieve the current status of the Kalshi exchange (trading and exchange activity) Retrieve the current status of the Kalshi exchange (V2 - exact API response)
#### Input #### Input
@@ -298,11 +419,13 @@ Retrieve the current status of the Kalshi exchange (trading and exchange activit
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `status` | object | Exchange status with trading_active and exchange_active flags | | `exchange_active` | boolean | Whether the exchange is active |
| `trading_active` | boolean | Whether trading is active |
| `exchange_estimated_resume_time` | string | Estimated time when exchange will resume \(if inactive\) |
### `kalshi_create_order` ### `kalshi_create_order`
Create a new order on a Kalshi prediction market Create a new order on a Kalshi prediction market (V2 with full API response)
#### Input #### Input
@@ -332,11 +455,44 @@ Create a new order on a Kalshi prediction market
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `order` | object | The created order object | | `order` | object | The created order object with full API response fields |
| ↳ `order_id` | string | Order ID |
| ↳ `user_id` | string | User ID |
| ↳ `client_order_id` | string | Client order ID |
| ↳ `ticker` | string | Market ticker |
| ↳ `side` | string | Order side \(yes/no\) |
| ↳ `action` | string | Action \(buy/sell\) |
| ↳ `type` | string | Order type \(limit/market\) |
| ↳ `status` | string | Order status \(resting/canceled/executed\) |
| ↳ `yes_price` | number | Yes price in cents |
| ↳ `no_price` | number | No price in cents |
| ↳ `yes_price_dollars` | string | Yes price in dollars |
| ↳ `no_price_dollars` | string | No price in dollars |
| ↳ `fill_count` | number | Filled contract count |
| ↳ `fill_count_fp` | string | Filled count \(fixed-point\) |
| ↳ `remaining_count` | number | Remaining contracts |
| ↳ `remaining_count_fp` | string | Remaining count \(fixed-point\) |
| ↳ `initial_count` | number | Initial contract count |
| ↳ `initial_count_fp` | string | Initial count \(fixed-point\) |
| ↳ `taker_fees` | number | Taker fees in cents |
| ↳ `maker_fees` | number | Maker fees in cents |
| ↳ `taker_fees_dollars` | string | Taker fees in dollars |
| ↳ `maker_fees_dollars` | string | Maker fees in dollars |
| ↳ `taker_fill_cost` | number | Taker fill cost in cents |
| ↳ `maker_fill_cost` | number | Maker fill cost in cents |
| ↳ `taker_fill_cost_dollars` | string | Taker fill cost in dollars |
| ↳ `maker_fill_cost_dollars` | string | Maker fill cost in dollars |
| ↳ `queue_position` | number | Queue position \(deprecated\) |
| ↳ `expiration_time` | string | Order expiration time |
| ↳ `created_time` | string | Order creation time |
| ↳ `last_update_time` | string | Last update time |
| ↳ `self_trade_prevention_type` | string | Self-trade prevention type |
| ↳ `order_group_id` | string | Order group ID |
| ↳ `cancel_order_on_pause` | boolean | Cancel on market pause |
### `kalshi_cancel_order` ### `kalshi_cancel_order`
Cancel an existing order on Kalshi Cancel an existing order on Kalshi (V2 with full API response)
#### Input #### Input
@@ -350,12 +506,46 @@ Cancel an existing order on Kalshi
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `order` | object | The canceled order object | | `order` | object | The canceled order object with full API response fields |
| `reducedBy` | number | Number of contracts canceled | | ↳ `order_id` | string | Order ID |
| ↳ `user_id` | string | User ID |
| ↳ `client_order_id` | string | Client order ID |
| ↳ `ticker` | string | Market ticker |
| ↳ `side` | string | Order side \(yes/no\) |
| ↳ `action` | string | Action \(buy/sell\) |
| ↳ `type` | string | Order type \(limit/market\) |
| ↳ `status` | string | Order status \(resting/canceled/executed\) |
| ↳ `yes_price` | number | Yes price in cents |
| ↳ `no_price` | number | No price in cents |
| ↳ `yes_price_dollars` | string | Yes price in dollars |
| ↳ `no_price_dollars` | string | No price in dollars |
| ↳ `fill_count` | number | Filled contract count |
| ↳ `fill_count_fp` | string | Filled count \(fixed-point\) |
| ↳ `remaining_count` | number | Remaining contracts |
| ↳ `remaining_count_fp` | string | Remaining count \(fixed-point\) |
| ↳ `initial_count` | number | Initial contract count |
| ↳ `initial_count_fp` | string | Initial count \(fixed-point\) |
| ↳ `taker_fees` | number | Taker fees in cents |
| ↳ `maker_fees` | number | Maker fees in cents |
| ↳ `taker_fees_dollars` | string | Taker fees in dollars |
| ↳ `maker_fees_dollars` | string | Maker fees in dollars |
| ↳ `taker_fill_cost` | number | Taker fill cost in cents |
| ↳ `maker_fill_cost` | number | Maker fill cost in cents |
| ↳ `taker_fill_cost_dollars` | string | Taker fill cost in dollars |
| ↳ `maker_fill_cost_dollars` | string | Maker fill cost in dollars |
| ↳ `queue_position` | number | Queue position \(deprecated\) |
| ↳ `expiration_time` | string | Order expiration time |
| ↳ `created_time` | string | Order creation time |
| ↳ `last_update_time` | string | Last update time |
| ↳ `self_trade_prevention_type` | string | Self-trade prevention type |
| ↳ `order_group_id` | string | Order group ID |
| ↳ `cancel_order_on_pause` | boolean | Cancel on market pause |
| `reduced_by` | number | Number of contracts canceled |
| `reduced_by_fp` | string | Number of contracts canceled in fixed-point format |
### `kalshi_amend_order` ### `kalshi_amend_order`
Modify the price or quantity of an existing order on Kalshi Modify the price or quantity of an existing order on Kalshi (V2 with full API response)
#### Input #### Input
@@ -379,6 +569,63 @@ Modify the price or quantity of an existing order on Kalshi
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `order` | object | The amended order object | | `old_order` | object | The original order object before amendment |
| ↳ `order_id` | string | Order ID |
| ↳ `user_id` | string | User ID |
| ↳ `ticker` | string | Market ticker |
| ↳ `event_ticker` | string | Event ticker |
| ↳ `status` | string | Order status |
| ↳ `side` | string | Order side \(yes/no\) |
| ↳ `type` | string | Order type \(limit/market\) |
| ↳ `yes_price` | number | Yes price in cents |
| ↳ `no_price` | number | No price in cents |
| ↳ `action` | string | Action \(buy/sell\) |
| ↳ `count` | number | Number of contracts |
| ↳ `remaining_count` | number | Remaining contracts |
| ↳ `created_time` | string | Order creation time |
| ↳ `expiration_time` | string | Order expiration time |
| ↳ `order_group_id` | string | Order group ID |
| ↳ `client_order_id` | string | Client order ID |
| ↳ `place_count` | number | Place count |
| ↳ `decrease_count` | number | Decrease count |
| ↳ `queue_position` | number | Queue position |
| ↳ `maker_fill_count` | number | Maker fill count |
| ↳ `taker_fill_count` | number | Taker fill count |
| ↳ `maker_fees` | number | Maker fees |
| ↳ `taker_fees` | number | Taker fees |
| ↳ `last_update_time` | string | Last update time |
| ↳ `take_profit_order_id` | string | Take profit order ID |
| ↳ `stop_loss_order_id` | string | Stop loss order ID |
| ↳ `amend_count` | number | Amend count |
| ↳ `amend_taker_fill_count` | number | Amend taker fill count |
| `order` | object | The amended order object with full API response fields |
| ↳ `order_id` | string | Order ID |
| ↳ `user_id` | string | User ID |
| ↳ `ticker` | string | Market ticker |
| ↳ `event_ticker` | string | Event ticker |
| ↳ `status` | string | Order status |
| ↳ `side` | string | Order side \(yes/no\) |
| ↳ `type` | string | Order type \(limit/market\) |
| ↳ `yes_price` | number | Yes price in cents |
| ↳ `no_price` | number | No price in cents |
| ↳ `action` | string | Action \(buy/sell\) |
| ↳ `count` | number | Number of contracts |
| ↳ `remaining_count` | number | Remaining contracts |
| ↳ `created_time` | string | Order creation time |
| ↳ `expiration_time` | string | Order expiration time |
| ↳ `order_group_id` | string | Order group ID |
| ↳ `client_order_id` | string | Client order ID |
| ↳ `place_count` | number | Place count |
| ↳ `decrease_count` | number | Decrease count |
| ↳ `queue_position` | number | Queue position |
| ↳ `maker_fill_count` | number | Maker fill count |
| ↳ `taker_fill_count` | number | Taker fill count |
| ↳ `maker_fees` | number | Maker fees |
| ↳ `taker_fees` | number | Taker fees |
| ↳ `last_update_time` | string | Last update time |
| ↳ `take_profit_order_id` | string | Take profit order ID |
| ↳ `stop_loss_order_id` | string | Stop loss order ID |
| ↳ `amend_count` | number | Amend count |
| ↳ `amend_taker_fill_count` | number | Amend taker fill count |

View File

@@ -12,6 +12,7 @@
"calendly", "calendly",
"circleback", "circleback",
"clay", "clay",
"clerk",
"confluence", "confluence",
"cursor", "cursor",
"datadog", "datadog",
@@ -97,7 +98,6 @@
"shopify", "shopify",
"slack", "slack",
"smtp", "smtp",
"spotify",
"sqs", "sqs",
"ssh", "ssh",
"stagehand", "stagehand",

View File

@@ -64,19 +64,10 @@ Parse PDF documents using Mistral OCR API
| ↳ `bottom_right_x` | number | Bottom-right X coordinate in pixels | | ↳ `bottom_right_x` | number | Bottom-right X coordinate in pixels |
| ↳ `bottom_right_y` | number | Bottom-right Y coordinate in pixels | | ↳ `bottom_right_y` | number | Bottom-right Y coordinate in pixels |
| ↳ `image_base64` | string | Base64-encoded image data \(when include_image_base64=true\) | | ↳ `image_base64` | string | Base64-encoded image data \(when include_image_base64=true\) |
| ↳ `id` | string | Image identifier \(e.g., img-0.jpeg\) |
| ↳ `top_left_x` | number | Top-left X coordinate in pixels |
| ↳ `top_left_y` | number | Top-left Y coordinate in pixels |
| ↳ `bottom_right_x` | number | Bottom-right X coordinate in pixels |
| ↳ `bottom_right_y` | number | Bottom-right Y coordinate in pixels |
| ↳ `image_base64` | string | Base64-encoded image data \(when include_image_base64=true\) |
| ↳ `dimensions` | object | Page dimensions | | ↳ `dimensions` | object | Page dimensions |
| ↳ `dpi` | number | Dots per inch | | ↳ `dpi` | number | Dots per inch |
| ↳ `height` | number | Page height in pixels | | ↳ `height` | number | Page height in pixels |
| ↳ `width` | number | Page width in pixels | | ↳ `width` | number | Page width in pixels |
| ↳ `dpi` | number | Dots per inch |
| ↳ `height` | number | Page height in pixels |
| ↳ `width` | number | Page width in pixels |
| ↳ `tables` | array | Extracted tables as HTML/markdown \(when table_format is set\). Referenced via placeholders like \[tbl-0.html\] | | ↳ `tables` | array | Extracted tables as HTML/markdown \(when table_format is set\). Referenced via placeholders like \[tbl-0.html\] |
| ↳ `hyperlinks` | array | Array of URL strings detected in the page \(e.g., \[ | | ↳ `hyperlinks` | array | Array of URL strings detected in the page \(e.g., \[ |
| ↳ `header` | string | Page header content \(when extract_header=true\) | | ↳ `header` | string | Page header content \(when extract_header=true\) |

View File

@@ -59,7 +59,5 @@ Generate embeddings from text using OpenAI
| ↳ `usage` | object | Token usage information | | ↳ `usage` | object | Token usage information |
| ↳ `prompt_tokens` | number | Number of tokens in the prompt | | ↳ `prompt_tokens` | number | Number of tokens in the prompt |
| ↳ `total_tokens` | number | Total number of tokens used | | ↳ `total_tokens` | number | Total number of tokens used |
| ↳ `prompt_tokens` | number | Number of tokens in the prompt |
| ↳ `total_tokens` | number | Total number of tokens used |

View File

@@ -112,9 +112,6 @@ Conduct comprehensive deep research across the web using Parallel AI. Synthesize
| ↳ `url` | string | Source URL | | ↳ `url` | string | Source URL |
| ↳ `title` | string | Source title | | ↳ `title` | string | Source title |
| ↳ `excerpts` | array | Relevant excerpts from the source | | ↳ `excerpts` | array | Relevant excerpts from the source |
| ↳ `url` | string | Source URL |
| ↳ `title` | string | Source title |
| ↳ `excerpts` | array | Relevant excerpts from the source |
| ↳ `confidence` | string | Confidence level indicator | | ↳ `confidence` | string | Confidence level indicator |

View File

@@ -29,7 +29,7 @@ By using these documented API endpoints, you can seamlessly integrate Polymarket
## Usage Instructions ## Usage Instructions
Integrate Polymarket prediction markets into the workflow. Can get markets, market, events, event, tags, series, orderbook, price, midpoint, price history, last trade price, spread, tick size, positions, trades, and search. Integrate Polymarket prediction markets into the workflow. Can get markets, market, events, event, tags, series, orderbook, price, midpoint, price history, last trade price, spread, tick size, positions, trades, activity, leaderboard, holders, and search.
@@ -43,7 +43,7 @@ Retrieve a list of prediction markets from Polymarket with optional filtering
| Parameter | Type | Required | Description | | Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- | | --------- | ---- | -------- | ----------- |
| `closed` | string | No | Filter by closed status \(true/false\). Use false for active markets only. | | `closed` | string | No | Filter by closed status \(true/false\). Use false for open markets only. |
| `order` | string | No | Sort field \(e.g., volumeNum, liquidityNum, startDate, endDate, createdAt\) | | `order` | string | No | Sort field \(e.g., volumeNum, liquidityNum, startDate, endDate, createdAt\) |
| `ascending` | string | No | Sort direction \(true for ascending, false for descending\) | | `ascending` | string | No | Sort direction \(true for ascending, false for descending\) |
| `tagId` | string | No | Filter by tag ID | | `tagId` | string | No | Filter by tag ID |
@@ -55,6 +55,21 @@ Retrieve a list of prediction markets from Polymarket with optional filtering
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `markets` | array | Array of market objects | | `markets` | array | Array of market objects |
| ↳ `id` | string | Market ID |
| ↳ `question` | string | Market question |
| ↳ `conditionId` | string | Condition ID |
| ↳ `slug` | string | Market slug |
| ↳ `endDate` | string | End date |
| ↳ `image` | string | Market image URL |
| ↳ `outcomes` | string | Outcomes JSON string |
| ↳ `outcomePrices` | string | Outcome prices JSON string |
| ↳ `volume` | string | Total volume |
| ↳ `liquidity` | string | Total liquidity |
| ↳ `active` | boolean | Whether market is active |
| ↳ `closed` | boolean | Whether market is closed |
| ↳ `volumeNum` | number | Volume as number |
| ↳ `liquidityNum` | number | Liquidity as number |
| ↳ `clobTokenIds` | array | CLOB token IDs |
### `polymarket_get_market` ### `polymarket_get_market`
@@ -72,6 +87,28 @@ Retrieve details of a specific prediction market by ID or slug
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `market` | object | Market object with details | | `market` | object | Market object with details |
| ↳ `id` | string | Market ID |
| ↳ `question` | string | Market question |
| ↳ `conditionId` | string | Condition ID |
| ↳ `slug` | string | Market slug |
| ↳ `resolutionSource` | string | Resolution source |
| ↳ `endDate` | string | End date |
| ↳ `startDate` | string | Start date |
| ↳ `image` | string | Market image URL |
| ↳ `icon` | string | Market icon URL |
| ↳ `description` | string | Market description |
| ↳ `outcomes` | string | Outcomes JSON string |
| ↳ `outcomePrices` | string | Outcome prices JSON string |
| ↳ `volume` | string | Total volume |
| ↳ `liquidity` | string | Total liquidity |
| ↳ `active` | boolean | Whether market is active |
| ↳ `closed` | boolean | Whether market is closed |
| ↳ `archived` | boolean | Whether market is archived |
| ↳ `volumeNum` | number | Volume as number |
| ↳ `liquidityNum` | number | Liquidity as number |
| ↳ `clobTokenIds` | array | CLOB token IDs |
| ↳ `acceptingOrders` | boolean | Whether accepting orders |
| ↳ `negRisk` | boolean | Whether negative risk |
### `polymarket_get_events` ### `polymarket_get_events`
@@ -81,7 +118,7 @@ Retrieve a list of events from Polymarket with optional filtering
| Parameter | Type | Required | Description | | Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- | | --------- | ---- | -------- | ----------- |
| `closed` | string | No | Filter by closed status \(true/false\). Use false for active events only. | | `closed` | string | No | Filter by closed status \(true/false\). Use false for open events only. |
| `order` | string | No | Sort field \(e.g., volume, liquidity, startDate, endDate, createdAt\) | | `order` | string | No | Sort field \(e.g., volume, liquidity, startDate, endDate, createdAt\) |
| `ascending` | string | No | Sort direction \(true for ascending, false for descending\) | | `ascending` | string | No | Sort direction \(true for ascending, false for descending\) |
| `tagId` | string | No | Filter by tag ID | | `tagId` | string | No | Filter by tag ID |
@@ -93,6 +130,21 @@ Retrieve a list of events from Polymarket with optional filtering
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `events` | array | Array of event objects | | `events` | array | Array of event objects |
| ↳ `id` | string | Event ID |
| ↳ `ticker` | string | Event ticker |
| ↳ `slug` | string | Event slug |
| ↳ `title` | string | Event title |
| ↳ `description` | string | Event description |
| ↳ `startDate` | string | Start date |
| ↳ `endDate` | string | End date |
| ↳ `image` | string | Event image URL |
| ↳ `icon` | string | Event icon URL |
| ↳ `active` | boolean | Whether event is active |
| ↳ `closed` | boolean | Whether event is closed |
| ↳ `archived` | boolean | Whether event is archived |
| ↳ `liquidity` | number | Total liquidity |
| ↳ `volume` | number | Total volume |
| ↳ `markets` | array | Array of markets in this event |
### `polymarket_get_event` ### `polymarket_get_event`
@@ -110,6 +162,24 @@ Retrieve details of a specific event by ID or slug
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `event` | object | Event object with details | | `event` | object | Event object with details |
| ↳ `id` | string | Event ID |
| ↳ `ticker` | string | Event ticker |
| ↳ `slug` | string | Event slug |
| ↳ `title` | string | Event title |
| ↳ `description` | string | Event description |
| ↳ `startDate` | string | Start date |
| ↳ `creationDate` | string | Creation date |
| ↳ `endDate` | string | End date |
| ↳ `image` | string | Event image URL |
| ↳ `icon` | string | Event icon URL |
| ↳ `active` | boolean | Whether event is active |
| ↳ `closed` | boolean | Whether event is closed |
| ↳ `archived` | boolean | Whether event is archived |
| ↳ `liquidity` | number | Total liquidity |
| ↳ `volume` | number | Total volume |
| ↳ `openInterest` | number | Open interest |
| ↳ `commentCount` | number | Comment count |
| ↳ `markets` | array | Array of markets in this event |
### `polymarket_get_tags` ### `polymarket_get_tags`
@@ -126,7 +196,12 @@ Retrieve available tags for filtering markets from Polymarket
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `tags` | array | Array of tag objects with id, label, and slug | | `tags` | array | Array of tag objects |
| ↳ `id` | string | Tag ID |
| ↳ `label` | string | Tag label |
| ↳ `slug` | string | Tag slug |
| ↳ `createdAt` | string | Creation timestamp |
| ↳ `updatedAt` | string | Last update timestamp |
### `polymarket_search` ### `polymarket_search`
@@ -138,13 +213,28 @@ Search for markets, events, and profiles on Polymarket
| --------- | ---- | -------- | ----------- | | --------- | ---- | -------- | ----------- |
| `query` | string | Yes | Search query term | | `query` | string | Yes | Search query term |
| `limit` | string | No | Number of results per page \(max 50\) | | `limit` | string | No | Number of results per page \(max 50\) |
| `offset` | string | No | Pagination offset | | `page` | string | No | Page number for pagination \(1-indexed\) |
| `cache` | string | No | Enable caching \(true/false\) |
| `eventsStatus` | string | No | Filter events by status |
| `limitPerType` | string | No | Limit results per type \(markets, events, profiles\) |
| `eventsTag` | string | No | Filter by event tags \(comma-separated\) |
| `sort` | string | No | Sort field |
| `ascending` | string | No | Sort direction \(true for ascending, false for descending\) |
| `searchTags` | string | No | Include tags in search results \(true/false\) |
| `searchProfiles` | string | No | Include profiles in search results \(true/false\) |
| `recurrence` | string | No | Filter by recurrence type |
| `excludeTagId` | string | No | Exclude events with these tag IDs \(comma-separated\) |
| `keepClosedMarkets` | string | No | Include closed markets in results \(0 or 1\) |
#### Output #### Output
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `results` | object | Search results containing markets, events, and profiles arrays | | `results` | object | Search results containing markets, events, tags, and profiles arrays |
| ↳ `markets` | array | Array of matching market objects |
| ↳ `events` | array | Array of matching event objects |
| ↳ `tags` | array | Array of matching tag objects |
| ↳ `profiles` | array | Array of matching profile objects |
### `polymarket_get_series` ### `polymarket_get_series`
@@ -162,6 +252,21 @@ Retrieve series (related market groups) from Polymarket
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `series` | array | Array of series objects | | `series` | array | Array of series objects |
| ↳ `id` | string | Series ID |
| ↳ `ticker` | string | Series ticker |
| ↳ `slug` | string | Series slug |
| ↳ `title` | string | Series title |
| ↳ `seriesType` | string | Series type |
| ↳ `recurrence` | string | Recurrence pattern |
| ↳ `image` | string | Series image URL |
| ↳ `icon` | string | Series icon URL |
| ↳ `active` | boolean | Whether series is active |
| ↳ `closed` | boolean | Whether series is closed |
| ↳ `archived` | boolean | Whether series is archived |
| ↳ `featured` | boolean | Whether series is featured |
| ↳ `volume` | number | Total volume |
| ↳ `liquidity` | number | Total liquidity |
| ↳ `eventCount` | number | Number of events in series |
### `polymarket_get_series_by_id` ### `polymarket_get_series_by_id`
@@ -178,6 +283,23 @@ Retrieve a specific series (related market group) by ID from Polymarket
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `series` | object | Series object with details | | `series` | object | Series object with details |
| ↳ `id` | string | Series ID |
| ↳ `ticker` | string | Series ticker |
| ↳ `slug` | string | Series slug |
| ↳ `title` | string | Series title |
| ↳ `seriesType` | string | Series type |
| ↳ `recurrence` | string | Recurrence pattern |
| ↳ `image` | string | Series image URL |
| ↳ `icon` | string | Series icon URL |
| ↳ `active` | boolean | Whether series is active |
| ↳ `closed` | boolean | Whether series is closed |
| ↳ `archived` | boolean | Whether series is archived |
| ↳ `featured` | boolean | Whether series is featured |
| ↳ `volume` | number | Total volume |
| ↳ `liquidity` | number | Total liquidity |
| ↳ `commentCount` | number | Comment count |
| ↳ `eventCount` | number | Number of events in series |
| ↳ `events` | array | Array of events in this series |
### `polymarket_get_orderbook` ### `polymarket_get_orderbook`
@@ -194,6 +316,19 @@ Retrieve the order book summary for a specific token
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `orderbook` | object | Order book with bids and asks arrays | | `orderbook` | object | Order book with bids and asks arrays |
| ↳ `market` | string | Market identifier |
| ↳ `asset_id` | string | Asset token ID |
| ↳ `hash` | string | Order book hash |
| ↳ `timestamp` | string | Timestamp |
| ↳ `bids` | array | Bid orders |
| ↳ `price` | string | Bid price |
| ↳ `size` | string | Bid size |
| ↳ `asks` | array | Ask orders |
| ↳ `price` | string | Ask price |
| ↳ `size` | string | Ask size |
| ↳ `min_order_size` | string | Minimum order size |
| ↳ `tick_size` | string | Tick size |
| ↳ `neg_risk` | boolean | Whether negative risk |
### `polymarket_get_price` ### `polymarket_get_price`
@@ -246,7 +381,9 @@ Retrieve historical price data for a specific market token
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `history` | array | Array of price history entries with timestamp \(t\) and price \(p\) | | `history` | array | Array of price history entries |
| ↳ `t` | number | Unix timestamp |
| ↳ `p` | number | Price at timestamp |
### `polymarket_get_last_trade_price` ### `polymarket_get_last_trade_price`
@@ -263,6 +400,7 @@ Retrieve the last trade price for a specific token
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `price` | string | Last trade price | | `price` | string | Last trade price |
| `side` | string | Side of the last trade \(BUY or SELL\) |
### `polymarket_get_spread` ### `polymarket_get_spread`
@@ -278,7 +416,8 @@ Retrieve the bid-ask spread for a specific token
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `spread` | object | Bid-ask spread with bid and ask prices | | `spread` | object | Spread value between bid and ask |
| ↳ `spread` | string | The spread value |
### `polymarket_get_tick_size` ### `polymarket_get_tick_size`
@@ -305,13 +444,47 @@ Retrieve user positions from Polymarket
| Parameter | Type | Required | Description | | Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- | | --------- | ---- | -------- | ----------- |
| `user` | string | Yes | User wallet address | | `user` | string | Yes | User wallet address |
| `market` | string | No | Optional market ID to filter positions | | `market` | string | No | Condition IDs to filter positions \(comma-separated, mutually exclusive with eventId\) |
| `eventId` | string | No | Event ID to filter positions \(mutually exclusive with market\) |
| `sizeThreshold` | string | No | Minimum position size threshold \(default: 1\) |
| `redeemable` | string | No | Filter for redeemable positions only \(true/false\) |
| `mergeable` | string | No | Filter for mergeable positions only \(true/false\) |
| `sortBy` | string | No | Sort field \(TOKENS, CURRENT, INITIAL, CASHPNL, PERCENTPNL, TITLE, RESOLVING, PRICE, AVGPRICE\) |
| `sortDirection` | string | No | Sort direction \(ASC or DESC\) |
| `title` | string | No | Search filter by title |
| `limit` | string | No | Number of results per page |
| `offset` | string | No | Pagination offset |
#### Output #### Output
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `positions` | array | Array of position objects | | `positions` | array | Array of position objects |
| ↳ `proxyWallet` | string | Proxy wallet address |
| ↳ `asset` | string | Asset token ID |
| ↳ `conditionId` | string | Condition ID |
| ↳ `size` | number | Position size |
| ↳ `avgPrice` | number | Average price |
| ↳ `initialValue` | number | Initial value |
| ↳ `currentValue` | number | Current value |
| ↳ `cashPnl` | number | Cash profit/loss |
| ↳ `percentPnl` | number | Percent profit/loss |
| ↳ `totalBought` | number | Total bought |
| ↳ `realizedPnl` | number | Realized profit/loss |
| ↳ `percentRealizedPnl` | number | Percent realized profit/loss |
| ↳ `curPrice` | number | Current price |
| ↳ `redeemable` | boolean | Whether position is redeemable |
| ↳ `mergeable` | boolean | Whether position is mergeable |
| ↳ `title` | string | Market title |
| ↳ `slug` | string | Market slug |
| ↳ `icon` | string | Market icon URL |
| ↳ `eventSlug` | string | Event slug |
| ↳ `outcome` | string | Outcome name |
| ↳ `outcomeIndex` | number | Outcome index |
| ↳ `oppositeOutcome` | string | Opposite outcome name |
| ↳ `oppositeAsset` | string | Opposite asset token ID |
| ↳ `endDate` | string | End date |
| ↳ `negativeRisk` | boolean | Whether negative risk |
### `polymarket_get_trades` ### `polymarket_get_trades`
@@ -322,8 +495,13 @@ Retrieve trade history from Polymarket
| Parameter | Type | Required | Description | | Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- | | --------- | ---- | -------- | ----------- |
| `user` | string | No | User wallet address to filter trades | | `user` | string | No | User wallet address to filter trades |
| `market` | string | No | Market ID to filter trades | | `market` | string | No | Market/condition ID to filter trades \(mutually exclusive with eventId\) |
| `limit` | string | No | Number of results per page \(max 50\) | | `eventId` | string | No | Event ID to filter trades \(mutually exclusive with market\) |
| `side` | string | No | Trade direction filter \(BUY or SELL\) |
| `takerOnly` | string | No | Filter for taker trades only \(true/false, default: true\) |
| `filterType` | string | No | Filter type \(CASH or TOKENS\) - requires filterAmount |
| `filterAmount` | string | No | Filter amount threshold - requires filterType |
| `limit` | string | No | Number of results per page \(default: 100, max: 10000\) |
| `offset` | string | No | Pagination offset \(skip this many results\) | | `offset` | string | No | Pagination offset \(skip this many results\) |
#### Output #### Output
@@ -331,5 +509,131 @@ Retrieve trade history from Polymarket
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `trades` | array | Array of trade objects | | `trades` | array | Array of trade objects |
| ↳ `proxyWallet` | string | Proxy wallet address |
| ↳ `side` | string | Trade side \(BUY or SELL\) |
| ↳ `asset` | string | Asset token ID |
| ↳ `conditionId` | string | Condition ID |
| ↳ `size` | number | Trade size |
| ↳ `price` | number | Trade price |
| ↳ `timestamp` | number | Unix timestamp |
| ↳ `title` | string | Market title |
| ↳ `slug` | string | Market slug |
| ↳ `icon` | string | Market icon URL |
| ↳ `eventSlug` | string | Event slug |
| ↳ `outcome` | string | Outcome name |
| ↳ `outcomeIndex` | number | Outcome index |
| ↳ `name` | string | Trader name |
| ↳ `pseudonym` | string | Trader pseudonym |
| ↳ `bio` | string | Trader bio |
| ↳ `profileImage` | string | Profile image URL |
| ↳ `profileImageOptimized` | string | Optimized profile image URL |
| ↳ `transactionHash` | string | Transaction hash |
### `polymarket_get_activity`
Retrieve on-chain activity for a user including trades, splits, merges, redemptions, rewards, and conversions
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `user` | string | Yes | User wallet address \(0x-prefixed\) |
| `limit` | string | No | Maximum results \(default: 100, max: 500\) |
| `offset` | string | No | Pagination offset \(default: 0, max: 10000\) |
| `market` | string | No | Comma-separated condition IDs \(mutually exclusive with eventId\) |
| `eventId` | string | No | Comma-separated event IDs \(mutually exclusive with market\) |
| `type` | string | No | Activity type filter: TRADE, SPLIT, MERGE, REDEEM, REWARD, CONVERSION, MAKER_REBATE |
| `start` | number | No | Start timestamp \(Unix seconds\) |
| `end` | number | No | End timestamp \(Unix seconds\) |
| `sortBy` | string | No | Sort field: TIMESTAMP, TOKENS, or CASH \(default: TIMESTAMP\) |
| `sortDirection` | string | No | Sort direction: ASC or DESC \(default: DESC\) |
| `side` | string | No | Trade side filter: BUY or SELL \(only applies to trades\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `activity` | array | Array of activity entries |
| ↳ `proxyWallet` | string | User proxy wallet address |
| ↳ `timestamp` | number | Unix timestamp of activity |
| ↳ `conditionId` | string | Market condition ID |
| ↳ `type` | string | Activity type \(TRADE, SPLIT, MERGE, REDEEM, REWARD, CONVERSION\) |
| ↳ `size` | number | Size in tokens |
| ↳ `usdcSize` | number | Size in USDC |
| ↳ `transactionHash` | string | Blockchain transaction hash |
| ↳ `price` | number | Price \(for trades\) |
| ↳ `asset` | string | Asset/token ID |
| ↳ `side` | string | Trade side \(BUY/SELL\) |
| ↳ `outcomeIndex` | number | Outcome index |
| ↳ `title` | string | Market title |
| ↳ `slug` | string | Market slug |
| ↳ `icon` | string | Market icon URL |
| ↳ `eventSlug` | string | Event slug |
| ↳ `outcome` | string | Outcome name |
| ↳ `name` | string | User display name |
| ↳ `pseudonym` | string | User pseudonym |
| ↳ `bio` | string | User bio |
| ↳ `profileImage` | string | User profile image URL |
| ↳ `profileImageOptimized` | string | Optimized profile image URL |
### `polymarket_get_leaderboard`
Retrieve trader leaderboard rankings by profit/loss or volume
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `category` | string | No | Category filter: OVERALL, POLITICS, SPORTS, CRYPTO, CULTURE, MENTIONS, WEATHER, ECONOMICS, TECH, FINANCE \(default: OVERALL\) |
| `timePeriod` | string | No | Time period: DAY, WEEK, MONTH, ALL \(default: DAY\) |
| `orderBy` | string | No | Order by: PNL or VOL \(default: PNL\) |
| `limit` | string | No | Number of results \(1-50, default: 25\) |
| `offset` | string | No | Pagination offset \(0-1000, default: 0\) |
| `user` | string | No | Filter by specific user wallet address |
| `userName` | string | No | Filter by username |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `leaderboard` | array | Array of leaderboard entries |
| ↳ `rank` | string | Leaderboard rank position |
| ↳ `proxyWallet` | string | User proxy wallet address |
| ↳ `userName` | string | User display name |
| ↳ `vol` | number | Trading volume |
| ↳ `pnl` | number | Profit and loss |
| ↳ `profileImage` | string | User profile image URL |
| ↳ `xUsername` | string | Twitter/X username |
| ↳ `verifiedBadge` | boolean | Whether user has verified badge |
### `polymarket_get_holders`
Retrieve top holders of a specific market token
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `market` | string | Yes | Comma-separated list of condition IDs |
| `limit` | string | No | Number of holders to return \(0-20, default: 20\) |
| `minBalance` | string | No | Minimum balance threshold \(default: 1\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `holders` | array | Array of market holder groups by token |
| ↳ `token` | string | Token/asset ID |
| ↳ `holders` | array | Array of holders for this token |
| ↳ `proxyWallet` | string | Holder wallet address |
| ↳ `bio` | string | Holder bio |
| ↳ `asset` | string | Asset ID |
| ↳ `pseudonym` | string | Holder pseudonym |
| ↳ `amount` | number | Amount held |
| ↳ `displayUsernamePublic` | boolean | Whether username is publicly displayed |
| ↳ `outcomeIndex` | number | Outcome index |
| ↳ `name` | string | Holder display name |
| ↳ `profileImage` | string | Profile image URL |
| ↳ `profileImageOptimized` | string | Optimized profile image URL |

View File

@@ -58,14 +58,9 @@ Retrieve accounts from Salesforce CRM
| ↳ `nextRecordsUrl` | string | URL for next page of results | | ↳ `nextRecordsUrl` | string | URL for next page of results |
| ↳ `totalSize` | number | Total number of records | | ↳ `totalSize` | number | Total number of records |
| ↳ `done` | boolean | Whether all records returned | | ↳ `done` | boolean | Whether all records returned |
| ↳ `nextRecordsUrl` | string | URL for next page of results |
| ↳ `totalSize` | number | Total number of records |
| ↳ `done` | boolean | Whether all records returned |
| ↳ `metadata` | object | Response metadata | | ↳ `metadata` | object | Response metadata |
| ↳ `totalReturned` | number | Number of accounts returned | | ↳ `totalReturned` | number | Number of accounts returned |
| ↳ `hasMore` | boolean | Whether more records exist | | ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `totalReturned` | number | Number of accounts returned |
| ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `success` | boolean | Salesforce operation success | | ↳ `success` | boolean | Salesforce operation success |
### `salesforce_create_account` ### `salesforce_create_account`
@@ -184,14 +179,9 @@ Get contact(s) from Salesforce - single contact if ID provided, or list if not
| ↳ `nextRecordsUrl` | string | URL for next page of results | | ↳ `nextRecordsUrl` | string | URL for next page of results |
| ↳ `totalSize` | number | Total number of records | | ↳ `totalSize` | number | Total number of records |
| ↳ `done` | boolean | Whether all records returned | | ↳ `done` | boolean | Whether all records returned |
| ↳ `nextRecordsUrl` | string | URL for next page of results |
| ↳ `totalSize` | number | Total number of records |
| ↳ `done` | boolean | Whether all records returned |
| ↳ `metadata` | object | Response metadata | | ↳ `metadata` | object | Response metadata |
| ↳ `totalReturned` | number | Number of contacts returned | | ↳ `totalReturned` | number | Number of contacts returned |
| ↳ `hasMore` | boolean | Whether more records exist | | ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `totalReturned` | number | Number of contacts returned |
| ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `singleContact` | boolean | Whether single contact was returned | | ↳ `singleContact` | boolean | Whether single contact was returned |
| ↳ `success` | boolean | Salesforce operation success | | ↳ `success` | boolean | Salesforce operation success |
@@ -311,14 +301,9 @@ Get lead(s) from Salesforce
| ↳ `nextRecordsUrl` | string | URL for next page of results | | ↳ `nextRecordsUrl` | string | URL for next page of results |
| ↳ `totalSize` | number | Total number of records | | ↳ `totalSize` | number | Total number of records |
| ↳ `done` | boolean | Whether all records returned | | ↳ `done` | boolean | Whether all records returned |
| ↳ `nextRecordsUrl` | string | URL for next page of results |
| ↳ `totalSize` | number | Total number of records |
| ↳ `done` | boolean | Whether all records returned |
| ↳ `metadata` | object | Response metadata | | ↳ `metadata` | object | Response metadata |
| ↳ `totalReturned` | number | Number of leads returned | | ↳ `totalReturned` | number | Number of leads returned |
| ↳ `hasMore` | boolean | Whether more records exist | | ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `totalReturned` | number | Number of leads returned |
| ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `singleLead` | boolean | Whether single lead was returned | | ↳ `singleLead` | boolean | Whether single lead was returned |
| ↳ `success` | boolean | Operation success status | | ↳ `success` | boolean | Operation success status |
@@ -430,14 +415,9 @@ Get opportunity(ies) from Salesforce
| ↳ `nextRecordsUrl` | string | URL for next page of results | | ↳ `nextRecordsUrl` | string | URL for next page of results |
| ↳ `totalSize` | number | Total number of records | | ↳ `totalSize` | number | Total number of records |
| ↳ `done` | boolean | Whether all records returned | | ↳ `done` | boolean | Whether all records returned |
| ↳ `nextRecordsUrl` | string | URL for next page of results |
| ↳ `totalSize` | number | Total number of records |
| ↳ `done` | boolean | Whether all records returned |
| ↳ `metadata` | object | Response metadata | | ↳ `metadata` | object | Response metadata |
| ↳ `totalReturned` | number | Number of opportunities returned | | ↳ `totalReturned` | number | Number of opportunities returned |
| ↳ `hasMore` | boolean | Whether more records exist | | ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `totalReturned` | number | Number of opportunities returned |
| ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `success` | boolean | Operation success status | | ↳ `success` | boolean | Operation success status |
### `salesforce_create_opportunity` ### `salesforce_create_opportunity`
@@ -544,14 +524,9 @@ Get case(s) from Salesforce
| ↳ `nextRecordsUrl` | string | URL for next page of results | | ↳ `nextRecordsUrl` | string | URL for next page of results |
| ↳ `totalSize` | number | Total number of records | | ↳ `totalSize` | number | Total number of records |
| ↳ `done` | boolean | Whether all records returned | | ↳ `done` | boolean | Whether all records returned |
| ↳ `nextRecordsUrl` | string | URL for next page of results |
| ↳ `totalSize` | number | Total number of records |
| ↳ `done` | boolean | Whether all records returned |
| ↳ `metadata` | object | Response metadata | | ↳ `metadata` | object | Response metadata |
| ↳ `totalReturned` | number | Number of cases returned | | ↳ `totalReturned` | number | Number of cases returned |
| ↳ `hasMore` | boolean | Whether more records exist | | ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `totalReturned` | number | Number of cases returned |
| ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `success` | boolean | Operation success status | | ↳ `success` | boolean | Operation success status |
### `salesforce_create_case` ### `salesforce_create_case`
@@ -655,14 +630,9 @@ Get task(s) from Salesforce
| ↳ `nextRecordsUrl` | string | URL for next page of results | | ↳ `nextRecordsUrl` | string | URL for next page of results |
| ↳ `totalSize` | number | Total number of records | | ↳ `totalSize` | number | Total number of records |
| ↳ `done` | boolean | Whether all records returned | | ↳ `done` | boolean | Whether all records returned |
| ↳ `nextRecordsUrl` | string | URL for next page of results |
| ↳ `totalSize` | number | Total number of records |
| ↳ `done` | boolean | Whether all records returned |
| ↳ `metadata` | object | Response metadata | | ↳ `metadata` | object | Response metadata |
| ↳ `totalReturned` | number | Number of tasks returned | | ↳ `totalReturned` | number | Number of tasks returned |
| ↳ `hasMore` | boolean | Whether more records exist | | ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `totalReturned` | number | Number of tasks returned |
| ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `success` | boolean | Operation success status | | ↳ `success` | boolean | Operation success status |
### `salesforce_create_task` ### `salesforce_create_task`
@@ -938,8 +908,6 @@ Execute a custom SOQL query to retrieve data from Salesforce
| ↳ `metadata` | object | Response metadata | | ↳ `metadata` | object | Response metadata |
| ↳ `totalReturned` | number | Number of records returned in this response | | ↳ `totalReturned` | number | Number of records returned in this response |
| ↳ `hasMore` | boolean | Whether more records exist | | ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `totalReturned` | number | Number of records returned in this response |
| ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `success` | boolean | Salesforce operation success | | ↳ `success` | boolean | Salesforce operation success |
### `salesforce_query_more` ### `salesforce_query_more`
@@ -967,8 +935,6 @@ Retrieve additional query results using the nextRecordsUrl from a previous query
| ↳ `metadata` | object | Response metadata | | ↳ `metadata` | object | Response metadata |
| ↳ `totalReturned` | number | Number of records returned in this response | | ↳ `totalReturned` | number | Number of records returned in this response |
| ↳ `hasMore` | boolean | Whether more records exist | | ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `totalReturned` | number | Number of records returned in this response |
| ↳ `hasMore` | boolean | Whether more records exist |
| ↳ `success` | boolean | Salesforce operation success | | ↳ `success` | boolean | Salesforce operation success |
### `salesforce_describe_object` ### `salesforce_describe_object`

View File

@@ -68,7 +68,7 @@ List issues from Sentry for a specific organization and optionally a specific pr
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `issues` | array | List of Sentry issues | | `issues` | array | List of Sentry issues |
| ↳ `id` | string | User ID | | ↳ `id` | string | Unique issue ID |
| ↳ `shortId` | string | Short issue identifier | | ↳ `shortId` | string | Short issue identifier |
| ↳ `title` | string | Issue title | | ↳ `title` | string | Issue title |
| ↳ `culprit` | string | Function or location that caused the issue | | ↳ `culprit` | string | Function or location that caused the issue |
@@ -78,27 +78,22 @@ List issues from Sentry for a specific organization and optionally a specific pr
| ↳ `status` | string | Current issue status | | ↳ `status` | string | Current issue status |
| ↳ `statusDetails` | object | Additional details about the status | | ↳ `statusDetails` | object | Additional details about the status |
| ↳ `isPublic` | boolean | Whether the issue is publicly visible | | ↳ `isPublic` | boolean | Whether the issue is publicly visible |
| ↳ `platform` | string | Project platform | | ↳ `platform` | string | Platform where the issue occurred |
| ↳ `project` | object | Project information | | ↳ `project` | object | Project information |
| ↳ `id` | string | Project ID | | ↳ `id` | string | Project ID |
| ↳ `name` | string | Project name | | ↳ `name` | string | Project name |
| ↳ `slug` | string | Project slug | | ↳ `slug` | string | Project slug |
| ↳ `platform` | string | Project platform | | ↳ `platform` | string | Project platform |
| ↳ `name` | string | User name | | ↳ `type` | string | Issue type |
| ↳ `slug` | string | Project slug |
| ↳ `type` | string | Type of error \(e.g., TypeError\) |
| ↳ `metadata` | object | Error metadata | | ↳ `metadata` | object | Error metadata |
| ↳ `type` | string | Type of error \(e.g., TypeError\) | | ↳ `type` | string | Type of error \(e.g., TypeError\) |
| ↳ `value` | string | Error message or value | | ↳ `value` | string | Error message or value |
| ↳ `function` | string | Function where the error occurred | | ↳ `function` | string | Function where the error occurred |
| ↳ `value` | string | Error message or value |
| ↳ `function` | string | Function where the error occurred |
| ↳ `numComments` | number | Number of comments on the issue | | ↳ `numComments` | number | Number of comments on the issue |
| ↳ `assignedTo` | object | User assigned to the issue | | ↳ `assignedTo` | object | User assigned to the issue |
| ↳ `id` | string | User ID | | ↳ `id` | string | User ID |
| ↳ `name` | string | User name | | ↳ `name` | string | User name |
| ↳ `email` | string | User email | | ↳ `email` | string | User email |
| ↳ `email` | string | User email |
| ↳ `isBookmarked` | boolean | Whether the issue is bookmarked | | ↳ `isBookmarked` | boolean | Whether the issue is bookmarked |
| ↳ `isSubscribed` | boolean | Whether subscribed to updates | | ↳ `isSubscribed` | boolean | Whether subscribed to updates |
| ↳ `hasSeen` | boolean | Whether the user has seen this issue | | ↳ `hasSeen` | boolean | Whether the user has seen this issue |
@@ -130,7 +125,7 @@ Retrieve detailed information about a specific Sentry issue by its ID. Returns c
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `issue` | object | Detailed information about the Sentry issue | | `issue` | object | Detailed information about the Sentry issue |
| ↳ `id` | string | User ID | | ↳ `id` | string | Unique issue ID |
| ↳ `shortId` | string | Short issue identifier | | ↳ `shortId` | string | Short issue identifier |
| ↳ `title` | string | Issue title | | ↳ `title` | string | Issue title |
| ↳ `culprit` | string | Function or location that caused the issue | | ↳ `culprit` | string | Function or location that caused the issue |
@@ -140,27 +135,22 @@ Retrieve detailed information about a specific Sentry issue by its ID. Returns c
| ↳ `status` | string | Current issue status | | ↳ `status` | string | Current issue status |
| ↳ `statusDetails` | object | Additional details about the status | | ↳ `statusDetails` | object | Additional details about the status |
| ↳ `isPublic` | boolean | Whether the issue is publicly visible | | ↳ `isPublic` | boolean | Whether the issue is publicly visible |
| ↳ `platform` | string | Project platform | | ↳ `platform` | string | Platform where the issue occurred |
| ↳ `project` | object | Project information | | ↳ `project` | object | Project information |
| ↳ `id` | string | Project ID | | ↳ `id` | string | Project ID |
| ↳ `name` | string | Project name | | ↳ `name` | string | Project name |
| ↳ `slug` | string | Project slug | | ↳ `slug` | string | Project slug |
| ↳ `platform` | string | Project platform | | ↳ `platform` | string | Project platform |
| ↳ `name` | string | User name | | ↳ `type` | string | Issue type |
| ↳ `slug` | string | Project slug |
| ↳ `type` | string | Type of error \(e.g., TypeError, ValueError\) |
| ↳ `metadata` | object | Error metadata | | ↳ `metadata` | object | Error metadata |
| ↳ `type` | string | Type of error \(e.g., TypeError, ValueError\) | | ↳ `type` | string | Type of error \(e.g., TypeError, ValueError\) |
| ↳ `value` | string | Error message or value | | ↳ `value` | string | Error message or value |
| ↳ `function` | string | Function where the error occurred | | ↳ `function` | string | Function where the error occurred |
| ↳ `value` | string | Error message or value |
| ↳ `function` | string | Function where the error occurred |
| ↳ `numComments` | number | Number of comments on the issue | | ↳ `numComments` | number | Number of comments on the issue |
| ↳ `assignedTo` | object | User assigned to the issue \(if any\) | | ↳ `assignedTo` | object | User assigned to the issue \(if any\) |
| ↳ `id` | string | User ID | | ↳ `id` | string | User ID |
| ↳ `name` | string | User name | | ↳ `name` | string | User name |
| ↳ `email` | string | User email | | ↳ `email` | string | User email |
| ↳ `email` | string | User email |
| ↳ `isBookmarked` | boolean | Whether the issue is bookmarked | | ↳ `isBookmarked` | boolean | Whether the issue is bookmarked |
| ↳ `isSubscribed` | boolean | Whether the user is subscribed to updates | | ↳ `isSubscribed` | boolean | Whether the user is subscribed to updates |
| ↳ `hasSeen` | boolean | Whether the user has seen this issue | | ↳ `hasSeen` | boolean | Whether the user has seen this issue |
@@ -194,7 +184,7 @@ Update a Sentry issue by changing its status, assignment, bookmark state, or oth
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `issue` | object | The updated Sentry issue | | `issue` | object | The updated Sentry issue |
| ↳ `id` | string | User ID | | ↳ `id` | string | Unique issue ID |
| ↳ `shortId` | string | Short issue identifier | | ↳ `shortId` | string | Short issue identifier |
| ↳ `title` | string | Issue title | | ↳ `title` | string | Issue title |
| ↳ `status` | string | Updated issue status | | ↳ `status` | string | Updated issue status |
@@ -202,8 +192,6 @@ Update a Sentry issue by changing its status, assignment, bookmark state, or oth
| ↳ `id` | string | User ID | | ↳ `id` | string | User ID |
| ↳ `name` | string | User name | | ↳ `name` | string | User name |
| ↳ `email` | string | User email | | ↳ `email` | string | User email |
| ↳ `name` | string | User name |
| ↳ `email` | string | User email |
| ↳ `isBookmarked` | boolean | Whether the issue is bookmarked | | ↳ `isBookmarked` | boolean | Whether the issue is bookmarked |
| ↳ `isSubscribed` | boolean | Whether the user is subscribed to updates | | ↳ `isSubscribed` | boolean | Whether the user is subscribed to updates |
| ↳ `isPublic` | boolean | Whether the issue is publicly visible | | ↳ `isPublic` | boolean | Whether the issue is publicly visible |
@@ -227,9 +215,9 @@ List all projects in a Sentry organization. Returns project details including na
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `projects` | array | List of Sentry projects | | `projects` | array | List of Sentry projects |
| ↳ `id` | string | Team ID | | ↳ `id` | string | Unique project ID |
| ↳ `slug` | string | Team slug | | ↳ `slug` | string | URL-friendly project identifier |
| ↳ `name` | string | Team name | | ↳ `name` | string | Project name |
| ↳ `platform` | string | Platform/language \(e.g., javascript, python\) | | ↳ `platform` | string | Platform/language \(e.g., javascript, python\) |
| ↳ `dateCreated` | string | When the project was created \(ISO timestamp\) | | ↳ `dateCreated` | string | When the project was created \(ISO timestamp\) |
| ↳ `isBookmarked` | boolean | Whether the project is bookmarked | | ↳ `isBookmarked` | boolean | Whether the project is bookmarked |
@@ -266,9 +254,9 @@ Retrieve detailed information about a specific Sentry project by its slug. Retur
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `project` | object | Detailed information about the Sentry project | | `project` | object | Detailed information about the Sentry project |
| ↳ `id` | string | Team ID | | ↳ `id` | string | Unique project ID |
| ↳ `slug` | string | Team slug | | ↳ `slug` | string | URL-friendly project identifier |
| ↳ `name` | string | Team name | | ↳ `name` | string | Project name |
| ↳ `platform` | string | Platform/language \(e.g., javascript, python\) | | ↳ `platform` | string | Platform/language \(e.g., javascript, python\) |
| ↳ `dateCreated` | string | When the project was created \(ISO timestamp\) | | ↳ `dateCreated` | string | When the project was created \(ISO timestamp\) |
| ↳ `isBookmarked` | boolean | Whether the project is bookmarked | | ↳ `isBookmarked` | boolean | Whether the project is bookmarked |
@@ -321,9 +309,9 @@ Create a new Sentry project in an organization. Requires a team to associate the
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `project` | object | The newly created Sentry project | | `project` | object | The newly created Sentry project |
| ↳ `id` | string | Team ID | | ↳ `id` | string | Unique project ID |
| ↳ `slug` | string | Team slug | | ↳ `slug` | string | URL-friendly project identifier |
| ↳ `name` | string | Team name | | ↳ `name` | string | Project name |
| ↳ `platform` | string | Platform/language | | ↳ `platform` | string | Platform/language |
| ↳ `dateCreated` | string | When the project was created \(ISO timestamp\) | | ↳ `dateCreated` | string | When the project was created \(ISO timestamp\) |
| ↳ `isBookmarked` | boolean | Whether the project is bookmarked | | ↳ `isBookmarked` | boolean | Whether the project is bookmarked |
@@ -370,9 +358,9 @@ Update a Sentry project by changing its name, slug, platform, or other settings.
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `project` | object | The updated Sentry project | | `project` | object | The updated Sentry project |
| ↳ `id` | string | Team ID | | ↳ `id` | string | Unique project ID |
| ↳ `slug` | string | Team slug | | ↳ `slug` | string | URL-friendly project identifier |
| ↳ `name` | string | Team name | | ↳ `name` | string | Project name |
| ↳ `platform` | string | Platform/language | | ↳ `platform` | string | Platform/language |
| ↳ `isBookmarked` | boolean | Whether the project is bookmarked | | ↳ `isBookmarked` | boolean | Whether the project is bookmarked |
| ↳ `organization` | object | Organization information | | ↳ `organization` | object | Organization information |
@@ -406,7 +394,7 @@ List events from a Sentry project. Can be filtered by issue ID, query, or time p
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `events` | array | List of Sentry events | | `events` | array | List of Sentry events |
| ↳ `id` | string | User ID | | ↳ `id` | string | Unique event ID |
| ↳ `eventID` | string | Event identifier | | ↳ `eventID` | string | Event identifier |
| ↳ `projectID` | string | Project ID | | ↳ `projectID` | string | Project ID |
| ↳ `groupID` | string | Issue group ID | | ↳ `groupID` | string | Issue group ID |
@@ -422,23 +410,16 @@ List events from a Sentry project. Can be filtered by issue ID, query, or time p
| ↳ `username` | string | Username | | ↳ `username` | string | Username |
| ↳ `ipAddress` | string | IP address | | ↳ `ipAddress` | string | IP address |
| ↳ `name` | string | User display name | | ↳ `name` | string | User display name |
| ↳ `email` | string | User email |
| ↳ `username` | string | Username |
| ↳ `ipAddress` | string | IP address |
| ↳ `name` | string | SDK name |
| ↳ `tags` | array | Tags associated with the event | | ↳ `tags` | array | Tags associated with the event |
| ↳ `key` | string | Tag key | | ↳ `key` | string | Tag key |
| ↳ `value` | string | Tag value | | ↳ `value` | string | Tag value |
| ↳ `key` | string | Tag key |
| ↳ `value` | string | Error message or value |
| ↳ `contexts` | object | Additional context data \(device, OS, etc.\) | | ↳ `contexts` | object | Additional context data \(device, OS, etc.\) |
| ↳ `platform` | string | Platform where the event occurred | | ↳ `platform` | string | Platform where the event occurred |
| ↳ `type` | string | Type of error \(e.g., TypeError\) | | ↳ `type` | string | Event type |
| ↳ `metadata` | object | Error metadata | | ↳ `metadata` | object | Error metadata |
| ↳ `type` | string | Type of error \(e.g., TypeError\) | | ↳ `type` | string | Type of error \(e.g., TypeError\) |
| ↳ `value` | string | Error message or value | | ↳ `value` | string | Error message or value |
| ↳ `function` | string | Function where the error occurred | | ↳ `function` | string | Function where the error occurred |
| ↳ `function` | string | Function where the error occurred |
| ↳ `entries` | array | Event entries \(exception, breadcrumbs, etc.\) | | ↳ `entries` | array | Event entries \(exception, breadcrumbs, etc.\) |
| ↳ `errors` | array | Processing errors | | ↳ `errors` | array | Processing errors |
| ↳ `dist` | string | Distribution identifier | | ↳ `dist` | string | Distribution identifier |
@@ -446,7 +427,6 @@ List events from a Sentry project. Can be filtered by issue ID, query, or time p
| ↳ `sdk` | object | SDK information | | ↳ `sdk` | object | SDK information |
| ↳ `name` | string | SDK name | | ↳ `name` | string | SDK name |
| ↳ `version` | string | SDK version | | ↳ `version` | string | SDK version |
| ↳ `version` | string | SDK version |
| `metadata` | object | Pagination metadata | | `metadata` | object | Pagination metadata |
| ↳ `nextCursor` | string | Cursor for the next page of results \(if available\) | | ↳ `nextCursor` | string | Cursor for the next page of results \(if available\) |
| ↳ `hasMore` | boolean | Whether there are more results available | | ↳ `hasMore` | boolean | Whether there are more results available |
@@ -469,7 +449,7 @@ Retrieve detailed information about a specific Sentry event by its ID. Returns c
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `event` | object | Detailed information about the Sentry event | | `event` | object | Detailed information about the Sentry event |
| ↳ `id` | string | User ID | | ↳ `id` | string | Unique event ID |
| ↳ `eventID` | string | Event identifier | | ↳ `eventID` | string | Event identifier |
| ↳ `projectID` | string | Project ID | | ↳ `projectID` | string | Project ID |
| ↳ `groupID` | string | Issue group ID this event belongs to | | ↳ `groupID` | string | Issue group ID this event belongs to |
@@ -485,23 +465,16 @@ Retrieve detailed information about a specific Sentry event by its ID. Returns c
| ↳ `username` | string | Username | | ↳ `username` | string | Username |
| ↳ `ipAddress` | string | IP address | | ↳ `ipAddress` | string | IP address |
| ↳ `name` | string | User display name | | ↳ `name` | string | User display name |
| ↳ `email` | string | User email |
| ↳ `username` | string | Username |
| ↳ `ipAddress` | string | IP address |
| ↳ `name` | string | SDK name |
| ↳ `tags` | array | Tags associated with the event | | ↳ `tags` | array | Tags associated with the event |
| ↳ `key` | string | Tag key | | ↳ `key` | string | Tag key |
| ↳ `value` | string | Tag value | | ↳ `value` | string | Tag value |
| ↳ `key` | string | Tag key |
| ↳ `value` | string | Error message or value |
| ↳ `contexts` | object | Additional context data \(device, OS, browser, etc.\) | | ↳ `contexts` | object | Additional context data \(device, OS, browser, etc.\) |
| ↳ `platform` | string | Platform where the event occurred | | ↳ `platform` | string | Platform where the event occurred |
| ↳ `type` | string | Type of error \(e.g., TypeError, ValueError\) | | ↳ `type` | string | Event type \(error, transaction, etc.\) |
| ↳ `metadata` | object | Error metadata | | ↳ `metadata` | object | Error metadata |
| ↳ `type` | string | Type of error \(e.g., TypeError, ValueError\) | | ↳ `type` | string | Type of error \(e.g., TypeError, ValueError\) |
| ↳ `value` | string | Error message or value | | ↳ `value` | string | Error message or value |
| ↳ `function` | string | Function where the error occurred | | ↳ `function` | string | Function where the error occurred |
| ↳ `function` | string | Function where the error occurred |
| ↳ `entries` | array | Event entries including exception, breadcrumbs, and request data | | ↳ `entries` | array | Event entries including exception, breadcrumbs, and request data |
| ↳ `errors` | array | Processing errors that occurred | | ↳ `errors` | array | Processing errors that occurred |
| ↳ `dist` | string | Distribution identifier | | ↳ `dist` | string | Distribution identifier |
@@ -509,7 +482,6 @@ Retrieve detailed information about a specific Sentry event by its ID. Returns c
| ↳ `sdk` | object | SDK information | | ↳ `sdk` | object | SDK information |
| ↳ `name` | string | SDK name | | ↳ `name` | string | SDK name |
| ↳ `version` | string | SDK version | | ↳ `version` | string | SDK version |
| ↳ `version` | string | SDK version |
### `sentry_releases_list` ### `sentry_releases_list`
@@ -531,36 +503,30 @@ List releases for a Sentry organization or project. Returns release details incl
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `releases` | array | List of Sentry releases | | `releases` | array | List of Sentry releases |
| ↳ `id` | string | Project ID | | ↳ `id` | string | Unique release ID |
| ↳ `version` | object | Version details | | ↳ `version` | string | Release version identifier |
| ↳ `raw` | string | Raw version string |
| ↳ `shortVersion` | string | Shortened version identifier | | ↳ `shortVersion` | string | Shortened version identifier |
| ↳ `ref` | string | Git reference \(commit SHA, tag, or branch\) | | ↳ `ref` | string | Git reference \(commit SHA, tag, or branch\) |
| ↳ `url` | string | URL to the release \(e.g., GitHub release page\) | | ↳ `url` | string | URL to the release \(e.g., GitHub release page\) |
| ↳ `dateReleased` | string | When the release was deployed \(ISO timestamp\) | | ↳ `dateReleased` | string | When the release was deployed \(ISO timestamp\) |
| ↳ `dateCreated` | string | Commit timestamp | | ↳ `dateCreated` | string | When the release was created \(ISO timestamp\) |
| ↳ `dateStarted` | string | Deploy start timestamp | | ↳ `dateStarted` | string | When the release started \(ISO timestamp\) |
| ↳ `newGroups` | number | Number of new issues introduced in this release | | ↳ `newGroups` | number | Number of new issues introduced in this release |
| ↳ `owner` | object | Owner of the release | | ↳ `owner` | object | Owner of the release |
| ↳ `id` | string | User ID | | ↳ `id` | string | User ID |
| ↳ `name` | string | User name | | ↳ `name` | string | User name |
| ↳ `email` | string | User email | | ↳ `email` | string | User email |
| ↳ `name` | string | Project name |
| ↳ `email` | string | Author email |
| ↳ `commitCount` | number | Number of commits in this release | | ↳ `commitCount` | number | Number of commits in this release |
| ↳ `deployCount` | number | Number of deploys for this release | | ↳ `deployCount` | number | Number of deploys for this release |
| ↳ `lastCommit` | object | Last commit in the release | | ↳ `lastCommit` | object | Last commit in the release |
| ↳ `id` | string | Commit SHA | | ↳ `id` | string | Commit SHA |
| ↳ `message` | string | Commit message | | ↳ `message` | string | Commit message |
| ↳ `dateCreated` | string | Commit timestamp | | ↳ `dateCreated` | string | Commit timestamp |
| ↳ `message` | string | Commit message |
| ↳ `lastDeploy` | object | Last deploy of the release | | ↳ `lastDeploy` | object | Last deploy of the release |
| ↳ `id` | string | Deploy ID | | ↳ `id` | string | Deploy ID |
| ↳ `environment` | string | Deploy environment | | ↳ `environment` | string | Deploy environment |
| ↳ `dateStarted` | string | Deploy start timestamp | | ↳ `dateStarted` | string | Deploy start timestamp |
| ↳ `dateFinished` | string | Deploy finish timestamp | | ↳ `dateFinished` | string | Deploy finish timestamp |
| ↳ `environment` | string | Deploy environment |
| ↳ `dateFinished` | string | Deploy finish timestamp |
| ↳ `authors` | array | Authors of commits in the release | | ↳ `authors` | array | Authors of commits in the release |
| ↳ `id` | string | Author ID | | ↳ `id` | string | Author ID |
| ↳ `name` | string | Author name | | ↳ `name` | string | Author name |
@@ -570,18 +536,12 @@ List releases for a Sentry organization or project. Returns release details incl
| ↳ `name` | string | Project name | | ↳ `name` | string | Project name |
| ↳ `slug` | string | Project slug | | ↳ `slug` | string | Project slug |
| ↳ `platform` | string | Project platform | | ↳ `platform` | string | Project platform |
| ↳ `slug` | string | Project slug |
| ↳ `platform` | string | Project platform |
| ↳ `firstEvent` | string | First event timestamp | | ↳ `firstEvent` | string | First event timestamp |
| ↳ `lastEvent` | string | Last event timestamp | | ↳ `lastEvent` | string | Last event timestamp |
| ↳ `versionInfo` | object | Version metadata | | ↳ `versionInfo` | object | Version metadata |
| ↳ `buildHash` | string | Build hash | | ↳ `buildHash` | string | Build hash |
| ↳ `version` | object | Version details | | ↳ `version` | object | Version details |
| ↳ `raw` | string | Raw version string | | ↳ `raw` | string | Raw version string |
| ↳ `raw` | string | Raw version string |
| ↳ `package` | string | Package name |
| ↳ `buildHash` | string | Build hash |
| ↳ `raw` | string | Raw version string |
| ↳ `package` | string | Package name | | ↳ `package` | string | Package name |
| `metadata` | object | Pagination metadata | | `metadata` | object | Pagination metadata |
| ↳ `nextCursor` | string | Cursor for the next page of results \(if available\) | | ↳ `nextCursor` | string | Cursor for the next page of results \(if available\) |
@@ -609,15 +569,14 @@ Create a new release in Sentry. A release is a version of your code deployed to
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `release` | object | The newly created Sentry release | | `release` | object | The newly created Sentry release |
| ↳ `id` | string | Project ID | | ↳ `id` | string | Unique release ID |
| ↳ `version` | object | Version details | | ↳ `version` | string | Release version identifier |
| ↳ `raw` | string | Raw version string |
| ↳ `shortVersion` | string | Shortened version identifier | | ↳ `shortVersion` | string | Shortened version identifier |
| ↳ `ref` | string | Git reference \(commit SHA, tag, or branch\) | | ↳ `ref` | string | Git reference \(commit SHA, tag, or branch\) |
| ↳ `url` | string | URL to the release | | ↳ `url` | string | URL to the release |
| ↳ `dateReleased` | string | When the release was deployed \(ISO timestamp\) | | ↳ `dateReleased` | string | When the release was deployed \(ISO timestamp\) |
| ↳ `dateCreated` | string | Commit timestamp | | ↳ `dateCreated` | string | When the release was created \(ISO timestamp\) |
| ↳ `dateStarted` | string | Deploy start timestamp | | ↳ `dateStarted` | string | When the release started \(ISO timestamp\) |
| ↳ `newGroups` | number | Number of new issues introduced | | ↳ `newGroups` | number | Number of new issues introduced |
| ↳ `commitCount` | number | Number of commits in this release | | ↳ `commitCount` | number | Number of commits in this release |
| ↳ `deployCount` | number | Number of deploys for this release | | ↳ `deployCount` | number | Number of deploys for this release |
@@ -625,20 +584,15 @@ Create a new release in Sentry. A release is a version of your code deployed to
| ↳ `id` | string | Owner ID | | ↳ `id` | string | Owner ID |
| ↳ `name` | string | Owner name | | ↳ `name` | string | Owner name |
| ↳ `email` | string | Owner email | | ↳ `email` | string | Owner email |
| ↳ `name` | string | Project name |
| ↳ `email` | string | Author email |
| ↳ `lastCommit` | object | Last commit in the release | | ↳ `lastCommit` | object | Last commit in the release |
| ↳ `id` | string | Commit SHA | | ↳ `id` | string | Commit SHA |
| ↳ `message` | string | Commit message | | ↳ `message` | string | Commit message |
| ↳ `dateCreated` | string | Commit timestamp | | ↳ `dateCreated` | string | Commit timestamp |
| ↳ `message` | string | Commit message |
| ↳ `lastDeploy` | object | Last deploy of the release | | ↳ `lastDeploy` | object | Last deploy of the release |
| ↳ `id` | string | Deploy ID | | ↳ `id` | string | Deploy ID |
| ↳ `environment` | string | Deploy environment | | ↳ `environment` | string | Deploy environment |
| ↳ `dateStarted` | string | Deploy start timestamp | | ↳ `dateStarted` | string | Deploy start timestamp |
| ↳ `dateFinished` | string | Deploy finish timestamp | | ↳ `dateFinished` | string | Deploy finish timestamp |
| ↳ `environment` | string | Deploy environment |
| ↳ `dateFinished` | string | Deploy finish timestamp |
| ↳ `authors` | array | Authors of commits in the release | | ↳ `authors` | array | Authors of commits in the release |
| ↳ `id` | string | Author ID | | ↳ `id` | string | Author ID |
| ↳ `name` | string | Author name | | ↳ `name` | string | Author name |
@@ -648,19 +602,13 @@ Create a new release in Sentry. A release is a version of your code deployed to
| ↳ `name` | string | Project name | | ↳ `name` | string | Project name |
| ↳ `slug` | string | Project slug | | ↳ `slug` | string | Project slug |
| ↳ `platform` | string | Project platform | | ↳ `platform` | string | Project platform |
| ↳ `slug` | string | Project slug |
| ↳ `platform` | string | Project platform |
| ↳ `firstEvent` | string | First event timestamp | | ↳ `firstEvent` | string | First event timestamp |
| ↳ `lastEvent` | string | Last event timestamp | | ↳ `lastEvent` | string | Last event timestamp |
| ↳ `versionInfo` | object | Version metadata | | ↳ `versionInfo` | object | Version metadata |
| ↳ `buildHash` | string | Build hash | | ↳ `buildHash` | string | Build hash |
| ↳ `version` | object | Version details | | ↳ `version` | object | Version details |
| ↳ `raw` | string | Raw version string | | ↳ `raw` | string | Raw version string |
| ↳ `raw` | string | Raw version string |
| ↳ `package` | string | Package name | | ↳ `package` | string | Package name |
| ↳ `buildHash` | string | Build hash |
| ↳ `raw` | string | Raw version string |
| ↳ `package` | string | Package name |
### `sentry_releases_deploy` ### `sentry_releases_deploy`

View File

@@ -95,13 +95,7 @@ Read a specific page from a SharePoint site
| ↳ `pageLayout` | string | The layout type of the page | | ↳ `pageLayout` | string | The layout type of the page |
| ↳ `createdDateTime` | string | When the page was created | | ↳ `createdDateTime` | string | When the page was created |
| ↳ `lastModifiedDateTime` | string | When the page was last modified | | ↳ `lastModifiedDateTime` | string | When the page was last modified |
| ↳ `id` | string | The unique ID of the page | | ↳ `content` | object | Extracted text content from the page |
| ↳ `name` | string | The name of the page |
| ↳ `title` | string | The title of the page |
| ↳ `webUrl` | string | The URL to access the page |
| ↳ `pageLayout` | string | The layout type of the page |
| ↳ `createdDateTime` | string | When the page was created |
| ↳ `lastModifiedDateTime` | string | When the page was last modified |
| ↳ `content` | string | Extracted text content from the page | | ↳ `content` | string | Extracted text content from the page |
| ↳ `canvasLayout` | object | Raw SharePoint canvas layout structure | | ↳ `canvasLayout` | object | Raw SharePoint canvas layout structure |
| `content` | object | Content of the SharePoint page | | `content` | object | Content of the SharePoint page |
@@ -135,10 +129,8 @@ List details of all SharePoint sites
| ↳ `isPersonalSite` | boolean | Whether this is a personal site | | ↳ `isPersonalSite` | boolean | Whether this is a personal site |
| ↳ `root` | object | Server relative URL | | ↳ `root` | object | Server relative URL |
| ↳ `serverRelativeUrl` | string | Server relative URL | | ↳ `serverRelativeUrl` | string | Server relative URL |
| ↳ `serverRelativeUrl` | string | Server relative URL |
| ↳ `siteCollection` | object | Site collection hostname | | ↳ `siteCollection` | object | Site collection hostname |
| ↳ `hostname` | string | Site collection hostname | | ↳ `hostname` | string | Site collection hostname |
| ↳ `hostname` | string | Site collection hostname |
| `sites` | array | List of all accessible SharePoint sites | | `sites` | array | List of all accessible SharePoint sites |
| ↳ `id` | string | The unique ID of the site | | ↳ `id` | string | The unique ID of the site |
| ↳ `name` | string | The name of the site | | ↳ `name` | string | The name of the site |
@@ -193,7 +185,7 @@ Get metadata (and optionally columns/items) for a SharePoint list
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `list` | object | Information about the SharePoint list | | `list` | object | Information about the SharePoint list |
| ↳ `id` | string | Item ID | | ↳ `id` | string | The unique ID of the list |
| ↳ `displayName` | string | The display name of the list | | ↳ `displayName` | string | The display name of the list |
| ↳ `name` | string | The internal name of the list | | ↳ `name` | string | The internal name of the list |
| ↳ `webUrl` | string | The web URL of the list | | ↳ `webUrl` | string | The web URL of the list |
@@ -201,7 +193,6 @@ Get metadata (and optionally columns/items) for a SharePoint list
| ↳ `lastModifiedDateTime` | string | When the list was last modified | | ↳ `lastModifiedDateTime` | string | When the list was last modified |
| ↳ `list` | object | List properties \(e.g., template\) | | ↳ `list` | object | List properties \(e.g., template\) |
| ↳ `columns` | array | List column definitions | | ↳ `columns` | array | List column definitions |
| ↳ `fields` | object | Field values for the item |
| `lists` | array | All lists in the site when no listId/title provided | | `lists` | array | All lists in the site when no listId/title provided |
### `sharepoint_update_list` ### `sharepoint_update_list`

View File

@@ -147,9 +147,9 @@ Read the latest messages from Slack channels. Retrieve conversation history with
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `messages` | array | Array of message objects from the channel | | `messages` | array | Array of message objects from the channel |
| ↳ `type` | string | Message type | | ↳ `type` | string | Message type |
| ↳ `ts` | string | Edit timestamp | | ↳ `ts` | string | Message timestamp |
| ↳ `text` | string | Message text content | | ↳ `text` | string | Message text content |
| ↳ `user` | string | User ID who edited | | ↳ `user` | string | User ID who sent the message |
| ↳ `bot_id` | string | Bot ID if sent by a bot | | ↳ `bot_id` | string | Bot ID if sent by a bot |
| ↳ `username` | string | Display username | | ↳ `username` | string | Display username |
| ↳ `channel` | string | Channel ID | | ↳ `channel` | string | Channel ID |
@@ -167,9 +167,6 @@ Read the latest messages from Slack channels. Retrieve conversation history with
| ↳ `name` | string | Emoji name | | ↳ `name` | string | Emoji name |
| ↳ `count` | number | Number of reactions | | ↳ `count` | number | Number of reactions |
| ↳ `users` | array | Array of user IDs who reacted | | ↳ `users` | array | Array of user IDs who reacted |
| ↳ `name` | string | File name |
| ↳ `count` | number | Number of reactions |
| ↳ `users` | array | Array of user IDs who reacted |
| ↳ `is_starred` | boolean | Whether message is starred | | ↳ `is_starred` | boolean | Whether message is starred |
| ↳ `pinned_to` | array | Array of channel IDs where message is pinned | | ↳ `pinned_to` | array | Array of channel IDs where message is pinned |
| ↳ `files` | array | Array of files attached to message | | ↳ `files` | array | Array of files attached to message |
@@ -180,17 +177,12 @@ Read the latest messages from Slack channels. Retrieve conversation history with
| ↳ `url_private` | string | Private download URL | | ↳ `url_private` | string | Private download URL |
| ↳ `permalink` | string | Permanent link to file | | ↳ `permalink` | string | Permanent link to file |
| ↳ `mode` | string | File mode | | ↳ `mode` | string | File mode |
| ↳ `id` | string | File ID |
| ↳ `mimetype` | string | MIME type |
| ↳ `size` | number | File size in bytes |
| ↳ `url_private` | string | Private download URL |
| ↳ `permalink` | string | Permanent link to message |
| ↳ `mode` | string | File mode |
| ↳ `attachments` | array | Array of legacy attachments | | ↳ `attachments` | array | Array of legacy attachments |
| ↳ `blocks` | array | Array of Block Kit blocks | | ↳ `blocks` | array | Array of Block Kit blocks |
| ↳ `edited` | object | Edit information if message was edited | | ↳ `edited` | object | Edit information if message was edited |
| ↳ `user` | string | User ID who edited | | ↳ `user` | string | User ID who edited |
| ↳ `ts` | string | Edit timestamp | | ↳ `ts` | string | Edit timestamp |
| ↳ `permalink` | string | Permanent link to message |
### `slack_get_message` ### `slack_get_message`
@@ -211,9 +203,9 @@ Retrieve a specific message by its timestamp. Useful for getting a thread parent
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `message` | object | The retrieved message object | | `message` | object | The retrieved message object |
| ↳ `type` | string | Message type | | ↳ `type` | string | Message type |
| ↳ `ts` | string | Edit timestamp | | ↳ `ts` | string | Message timestamp |
| ↳ `text` | string | Message text content | | ↳ `text` | string | Message text content |
| ↳ `user` | string | User ID who edited | | ↳ `user` | string | User ID who sent the message |
| ↳ `bot_id` | string | Bot ID if sent by a bot | | ↳ `bot_id` | string | Bot ID if sent by a bot |
| ↳ `username` | string | Display username | | ↳ `username` | string | Display username |
| ↳ `channel` | string | Channel ID | | ↳ `channel` | string | Channel ID |
@@ -228,9 +220,6 @@ Retrieve a specific message by its timestamp. Useful for getting a thread parent
| ↳ `name` | string | Emoji name | | ↳ `name` | string | Emoji name |
| ↳ `count` | number | Number of reactions | | ↳ `count` | number | Number of reactions |
| ↳ `users` | array | User IDs who reacted | | ↳ `users` | array | User IDs who reacted |
| ↳ `name` | string | File name |
| ↳ `count` | number | Number of reactions |
| ↳ `users` | array | User IDs who reacted |
| ↳ `is_starred` | boolean | Whether message is starred | | ↳ `is_starred` | boolean | Whether message is starred |
| ↳ `pinned_to` | array | Channel IDs where message is pinned | | ↳ `pinned_to` | array | Channel IDs where message is pinned |
| ↳ `files` | array | Files attached to message | | ↳ `files` | array | Files attached to message |
@@ -240,16 +229,12 @@ Retrieve a specific message by its timestamp. Useful for getting a thread parent
| ↳ `size` | number | File size in bytes | | ↳ `size` | number | File size in bytes |
| ↳ `url_private` | string | Private download URL | | ↳ `url_private` | string | Private download URL |
| ↳ `permalink` | string | Permanent link to file | | ↳ `permalink` | string | Permanent link to file |
| ↳ `id` | string | File ID |
| ↳ `mimetype` | string | MIME type |
| ↳ `size` | number | File size in bytes |
| ↳ `url_private` | string | Private download URL |
| ↳ `permalink` | string | Permanent link to message |
| ↳ `attachments` | array | Legacy attachments | | ↳ `attachments` | array | Legacy attachments |
| ↳ `blocks` | array | Block Kit blocks | | ↳ `blocks` | array | Block Kit blocks |
| ↳ `edited` | object | Edit information if message was edited | | ↳ `edited` | object | Edit information if message was edited |
| ↳ `user` | string | User ID who edited | | ↳ `user` | string | User ID who edited |
| ↳ `ts` | string | Edit timestamp | | ↳ `ts` | string | Edit timestamp |
| ↳ `permalink` | string | Permanent link to message |
### `slack_get_thread` ### `slack_get_thread`
@@ -283,17 +268,11 @@ Retrieve an entire thread including the parent message and all replies. Useful f
| ↳ `name` | string | Emoji name | | ↳ `name` | string | Emoji name |
| ↳ `count` | number | Number of reactions | | ↳ `count` | number | Number of reactions |
| ↳ `users` | array | User IDs who reacted | | ↳ `users` | array | User IDs who reacted |
| ↳ `name` | string | File name |
| ↳ `count` | number | Number of reactions |
| ↳ `users` | array | User IDs who reacted |
| ↳ `files` | array | Files attached to the parent message | | ↳ `files` | array | Files attached to the parent message |
| ↳ `id` | string | File ID | | ↳ `id` | string | File ID |
| ↳ `name` | string | File name | | ↳ `name` | string | File name |
| ↳ `mimetype` | string | MIME type | | ↳ `mimetype` | string | MIME type |
| ↳ `size` | number | File size in bytes | | ↳ `size` | number | File size in bytes |
| ↳ `id` | string | File ID |
| ↳ `mimetype` | string | MIME type |
| ↳ `size` | number | File size in bytes |
| `replies` | array | Array of reply messages in the thread \(excluding the parent\) | | `replies` | array | Array of reply messages in the thread \(excluding the parent\) |
| ↳ `ts` | string | Message timestamp | | ↳ `ts` | string | Message timestamp |
| ↳ `text` | string | Message text content | | ↳ `text` | string | Message text content |

File diff suppressed because it is too large Load Diff

View File

@@ -86,9 +86,6 @@ Run an autonomous web agent to complete tasks and extract structured data
| ↳ `type` | string | Type of action performed | | ↳ `type` | string | Type of action performed |
| ↳ `params` | object | Parameters used for the action | | ↳ `params` | object | Parameters used for the action |
| ↳ `result` | object | Result of the action | | ↳ `result` | object | Result of the action |
| ↳ `type` | string | Type of action performed |
| ↳ `params` | object | Parameters used for the action |
| ↳ `result` | object | Result of the action |
| `structuredOutput` | object | Extracted data matching the provided output schema | | `structuredOutput` | object | Extracted data matching the provided output schema |

View File

@@ -299,7 +299,7 @@ Upload a file to a Supabase storage bucket
| `bucket` | string | Yes | The name of the storage bucket | | `bucket` | string | Yes | The name of the storage bucket |
| `fileName` | string | Yes | The name of the file \(e.g., "document.pdf", "image.jpg"\) | | `fileName` | string | Yes | The name of the file \(e.g., "document.pdf", "image.jpg"\) |
| `path` | string | No | Optional folder path \(e.g., "folder/subfolder/"\) | | `path` | string | No | Optional folder path \(e.g., "folder/subfolder/"\) |
| `fileContent` | string | Yes | The file content \(base64 encoded for binary files, or plain text\) | | `fileData` | json | Yes | File to upload - UserFile object \(basic mode\) or string content \(advanced mode: base64 or plain text\). Supports data URLs. |
| `contentType` | string | No | MIME type of the file \(e.g., "image/jpeg", "text/plain"\) | | `contentType` | string | No | MIME type of the file \(e.g., "image/jpeg", "text/plain"\) |
| `upsert` | boolean | No | If true, overwrites existing file \(default: false\) | | `upsert` | boolean | No | If true, overwrites existing file \(default: false\) |
| `apiKey` | string | Yes | Your Supabase service role secret key | | `apiKey` | string | Yes | Your Supabase service role secret key |
@@ -309,7 +309,7 @@ Upload a file to a Supabase storage bucket
| Parameter | Type | Description | | Parameter | Type | Description |
| --------- | ---- | ----------- | | --------- | ---- | ----------- |
| `message` | string | Operation status message | | `message` | string | Operation status message |
| `results` | object | Upload result including file path and metadata | | `results` | object | Upload result including file path, bucket, and public URL |
### `supabase_storage_download` ### `supabase_storage_download`

View File

@@ -82,16 +82,11 @@ Send messages to Telegram channels or users through the Telegram Bot API. Enable
| ↳ `is_bot` | boolean | Whether the chat is a bot or not | | ↳ `is_bot` | boolean | Whether the chat is a bot or not |
| ↳ `first_name` | string | Chat username \(if available\) | | ↳ `first_name` | string | Chat username \(if available\) |
| ↳ `username` | string | Chat title \(for groups and channels\) | | ↳ `username` | string | Chat title \(for groups and channels\) |
| ↳ `id` | number | Bot user ID |
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
| ↳ `first_name` | string | Bot first name |
| ↳ `username` | string | Bot username |
| ↳ `chat` | object | Information about the bot that sent the message | | ↳ `chat` | object | Information about the bot that sent the message |
| ↳ `id` | number | Bot user ID | | ↳ `id` | number | Bot user ID |
| ↳ `first_name` | string | Bot first name | | ↳ `first_name` | string | Bot first name |
| ↳ `username` | string | Bot username | | ↳ `username` | string | Bot username |
| ↳ `type` | string | chat type private or channel | | ↳ `type` | string | chat type private or channel |
| ↳ `type` | string | chat type private or channel |
| ↳ `date` | number | Unix timestamp when message was sent | | ↳ `date` | number | Unix timestamp when message was sent |
| ↳ `text` | string | Text content of the sent message | | ↳ `text` | string | Text content of the sent message |
@@ -141,16 +136,11 @@ Send photos to Telegram channels or users through the Telegram Bot API.
| ↳ `is_bot` | boolean | Whether the chat is a bot or not | | ↳ `is_bot` | boolean | Whether the chat is a bot or not |
| ↳ `first_name` | string | Chat username \(if available\) | | ↳ `first_name` | string | Chat username \(if available\) |
| ↳ `username` | string | Chat title \(for groups and channels\) | | ↳ `username` | string | Chat title \(for groups and channels\) |
| ↳ `id` | number | Bot user ID |
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
| ↳ `first_name` | string | Bot first name |
| ↳ `username` | string | Bot username |
| ↳ `chat` | object | Information about the bot that sent the message | | ↳ `chat` | object | Information about the bot that sent the message |
| ↳ `id` | number | Bot user ID | | ↳ `id` | number | Bot user ID |
| ↳ `first_name` | string | Bot first name | | ↳ `first_name` | string | Bot first name |
| ↳ `username` | string | Bot username | | ↳ `username` | string | Bot username |
| ↳ `type` | string | Chat type \(private, group, supergroup, channel\) | | ↳ `type` | string | Chat type \(private, group, supergroup, channel\) |
| ↳ `type` | string | Chat type \(private, group, supergroup, channel\) |
| ↳ `date` | number | Unix timestamp when message was sent | | ↳ `date` | number | Unix timestamp when message was sent |
| ↳ `text` | string | Text content of the sent message \(if applicable\) | | ↳ `text` | string | Text content of the sent message \(if applicable\) |
| ↳ `photo` | array | List of photos included in the message | | ↳ `photo` | array | List of photos included in the message |
@@ -159,11 +149,6 @@ Send photos to Telegram channels or users through the Telegram Bot API.
| ↳ `file_size` | number | Size of the photo file in bytes | | ↳ `file_size` | number | Size of the photo file in bytes |
| ↳ `width` | number | Photo width in pixels | | ↳ `width` | number | Photo width in pixels |
| ↳ `height` | number | Photo height in pixels | | ↳ `height` | number | Photo height in pixels |
| ↳ `file_id` | string | Unique file ID of the photo |
| ↳ `file_unique_id` | string | Unique identifier for this file across different bots |
| ↳ `file_size` | number | Size of the photo file in bytes |
| ↳ `width` | number | Photo width in pixels |
| ↳ `height` | number | Photo height in pixels |
### `telegram_send_video` ### `telegram_send_video`
@@ -190,25 +175,26 @@ Send videos to Telegram channels or users through the Telegram Bot API.
| ↳ `is_bot` | boolean | Whether the chat is a bot or not | | ↳ `is_bot` | boolean | Whether the chat is a bot or not |
| ↳ `first_name` | string | Sender | | ↳ `first_name` | string | Sender |
| ↳ `username` | string | Sender | | ↳ `username` | string | Sender |
| ↳ `id` | number | Chat ID |
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
| ↳ `first_name` | string | Chat first name \(if private chat\) |
| ↳ `username` | string | Chat username \(for private or channels\) |
| ↳ `chat` | object | Information about the chat where message was sent | | ↳ `chat` | object | Information about the chat where message was sent |
| ↳ `id` | number | Chat ID | | ↳ `id` | number | Chat ID |
| ↳ `first_name` | string | Chat first name \(if private chat\) | | ↳ `first_name` | string | Chat first name \(if private chat\) |
| ↳ `username` | string | Chat username \(for private or channels\) | | ↳ `username` | string | Chat username \(for private or channels\) |
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) | | ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
| ↳ `date` | number | Unix timestamp when the message was sent | | ↳ `date` | number | Unix timestamp when the message was sent |
| ↳ `text` | string | Text content of the sent message \(if applicable\) | | ↳ `text` | string | Text content of the sent message \(if applicable\) |
| ↳ `format` | object | Media format information \(for videos, GIFs, etc.\) | | ↳ `format` | object | Media format information \(for videos, GIFs, etc.\) |
| ↳ `file_name` | string | Media file name | | ↳ `file_name` | string | Media file name |
| ↳ `mime_type` | string | Media MIME type | | ↳ `mime_type` | string | Media MIME type |
| ↳ `duration` | number | Duration of media in seconds | | ↳ `duration` | number | Duration of media in seconds |
| ↳ `width` | number | Media width in pixels |
| ↳ `height` | number | Media height in pixels |
| ↳ `thumbnail` | object | Thumbnail image details |
| ↳ `file_id` | string | Thumbnail file ID |
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
| ↳ `file_size` | number | Thumbnail file size in bytes |
| ↳ `width` | number | Thumbnail width in pixels | | ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels | | ↳ `height` | number | Thumbnail height in pixels |
| ↳ `thumbnail` | object | Thumbnail image details | | ↳ `thumb` | object | Secondary thumbnail details \(duplicate of thumbnail\) |
| ↳ `file_id` | string | Thumbnail file ID | | ↳ `file_id` | string | Thumbnail file ID |
| ↳ `file_unique_id` | string | Unique thumbnail file identifier | | ↳ `file_unique_id` | string | Unique thumbnail file identifier |
| ↳ `file_size` | number | Thumbnail file size in bytes | | ↳ `file_size` | number | Thumbnail file size in bytes |
@@ -217,32 +203,6 @@ Send videos to Telegram channels or users through the Telegram Bot API.
| ↳ `file_id` | string | Media file ID | | ↳ `file_id` | string | Media file ID |
| ↳ `file_unique_id` | string | Unique media file identifier | | ↳ `file_unique_id` | string | Unique media file identifier |
| ↳ `file_size` | number | Size of media file in bytes | | ↳ `file_size` | number | Size of media file in bytes |
| ↳ `thumb` | object | Secondary thumbnail details \(duplicate of thumbnail\) |
| ↳ `file_id` | string | Thumbnail file ID |
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
| ↳ `file_size` | number | Thumbnail file size in bytes |
| ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels |
| ↳ `file_name` | string | Document file name |
| ↳ `mime_type` | string | Document MIME type |
| ↳ `duration` | number | Duration of media in seconds |
| ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels |
| ↳ `thumbnail` | object | Document thumbnail information |
| ↳ `file_id` | string | Thumbnail file ID |
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
| ↳ `file_size` | number | Thumbnail file size in bytes |
| ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels |
| ↳ `file_id` | string | Document file ID |
| ↳ `file_unique_id` | string | Unique document file identifier |
| ↳ `file_size` | number | Size of document file in bytes |
| ↳ `thumb` | object | Duplicate thumbnail info \(used for compatibility\) |
| ↳ `file_id` | string | Thumbnail file ID |
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
| ↳ `file_size` | number | Thumbnail file size in bytes |
| ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels |
| ↳ `document` | object | Document file details if the message contains a document | | ↳ `document` | object | Document file details if the message contains a document |
| ↳ `file_name` | string | Document file name | | ↳ `file_name` | string | Document file name |
| ↳ `mime_type` | string | Document MIME type | | ↳ `mime_type` | string | Document MIME type |
@@ -252,17 +212,15 @@ Send videos to Telegram channels or users through the Telegram Bot API.
| ↳ `file_size` | number | Thumbnail file size in bytes | | ↳ `file_size` | number | Thumbnail file size in bytes |
| ↳ `width` | number | Thumbnail width in pixels | | ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels | | ↳ `height` | number | Thumbnail height in pixels |
| ↳ `file_id` | string | Document file ID |
| ↳ `file_unique_id` | string | Unique document file identifier |
| ↳ `file_size` | number | Size of document file in bytes |
| ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels |
| ↳ `thumb` | object | Duplicate thumbnail info \(used for compatibility\) | | ↳ `thumb` | object | Duplicate thumbnail info \(used for compatibility\) |
| ↳ `file_id` | string | Thumbnail file ID | | ↳ `file_id` | string | Thumbnail file ID |
| ↳ `file_unique_id` | string | Unique thumbnail file identifier | | ↳ `file_unique_id` | string | Unique thumbnail file identifier |
| ↳ `file_size` | number | Thumbnail file size in bytes | | ↳ `file_size` | number | Thumbnail file size in bytes |
| ↳ `width` | number | Thumbnail width in pixels | | ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels | | ↳ `height` | number | Thumbnail height in pixels |
| ↳ `file_id` | string | Document file ID |
| ↳ `file_unique_id` | string | Unique document file identifier |
| ↳ `file_size` | number | Size of document file in bytes |
### `telegram_send_audio` ### `telegram_send_audio`
@@ -289,16 +247,11 @@ Send audio files to Telegram channels or users through the Telegram Bot API.
| ↳ `is_bot` | boolean | Whether the chat is a bot or not | | ↳ `is_bot` | boolean | Whether the chat is a bot or not |
| ↳ `first_name` | string | Sender | | ↳ `first_name` | string | Sender |
| ↳ `username` | string | Sender | | ↳ `username` | string | Sender |
| ↳ `id` | number | Chat ID |
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
| ↳ `first_name` | string | Chat first name \(if private chat\) |
| ↳ `username` | string | Chat username \(for private or channels\) |
| ↳ `chat` | object | Information about the chat where the message was sent | | ↳ `chat` | object | Information about the chat where the message was sent |
| ↳ `id` | number | Chat ID | | ↳ `id` | number | Chat ID |
| ↳ `first_name` | string | Chat first name \(if private chat\) | | ↳ `first_name` | string | Chat first name \(if private chat\) |
| ↳ `username` | string | Chat username \(for private or channels\) | | ↳ `username` | string | Chat username \(for private or channels\) |
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) | | ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
| ↳ `date` | number | Unix timestamp when the message was sent | | ↳ `date` | number | Unix timestamp when the message was sent |
| ↳ `text` | string | Text content of the sent message \(if applicable\) | | ↳ `text` | string | Text content of the sent message \(if applicable\) |
| ↳ `audio` | object | Audio file details | | ↳ `audio` | object | Audio file details |
@@ -310,14 +263,6 @@ Send audio files to Telegram channels or users through the Telegram Bot API.
| ↳ `file_id` | string | Unique file identifier for this audio | | ↳ `file_id` | string | Unique file identifier for this audio |
| ↳ `file_unique_id` | string | Unique identifier across different bots for this file | | ↳ `file_unique_id` | string | Unique identifier across different bots for this file |
| ↳ `file_size` | number | Size of the audio file in bytes | | ↳ `file_size` | number | Size of the audio file in bytes |
| ↳ `duration` | number | Duration of the audio in seconds |
| ↳ `performer` | string | Performer of the audio |
| ↳ `title` | string | Title of the audio |
| ↳ `file_name` | string | Original filename of the audio |
| ↳ `mime_type` | string | MIME type of the audio file |
| ↳ `file_id` | string | Unique file identifier for this audio |
| ↳ `file_unique_id` | string | Unique identifier across different bots for this file |
| ↳ `file_size` | number | Size of the audio file in bytes |
### `telegram_send_animation` ### `telegram_send_animation`
@@ -344,25 +289,26 @@ Send animations (GIFs) to Telegram channels or users through the Telegram Bot AP
| ↳ `is_bot` | boolean | Whether the chat is a bot or not | | ↳ `is_bot` | boolean | Whether the chat is a bot or not |
| ↳ `first_name` | string | Sender | | ↳ `first_name` | string | Sender |
| ↳ `username` | string | Sender | | ↳ `username` | string | Sender |
| ↳ `id` | number | Chat ID |
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
| ↳ `first_name` | string | Chat first name \(if private chat\) |
| ↳ `username` | string | Chat username \(for private or channels\) |
| ↳ `chat` | object | Information about the chat where message was sent | | ↳ `chat` | object | Information about the chat where message was sent |
| ↳ `id` | number | Chat ID | | ↳ `id` | number | Chat ID |
| ↳ `first_name` | string | Chat first name \(if private chat\) | | ↳ `first_name` | string | Chat first name \(if private chat\) |
| ↳ `username` | string | Chat username \(for private or channels\) | | ↳ `username` | string | Chat username \(for private or channels\) |
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) | | ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
| ↳ `date` | number | Unix timestamp when the message was sent | | ↳ `date` | number | Unix timestamp when the message was sent |
| ↳ `text` | string | Text content of the sent message \(if applicable\) | | ↳ `text` | string | Text content of the sent message \(if applicable\) |
| ↳ `format` | object | Media format information \(for videos, GIFs, etc.\) | | ↳ `format` | object | Media format information \(for videos, GIFs, etc.\) |
| ↳ `file_name` | string | Media file name | | ↳ `file_name` | string | Media file name |
| ↳ `mime_type` | string | Media MIME type | | ↳ `mime_type` | string | Media MIME type |
| ↳ `duration` | number | Duration of media in seconds | | ↳ `duration` | number | Duration of media in seconds |
| ↳ `width` | number | Media width in pixels |
| ↳ `height` | number | Media height in pixels |
| ↳ `thumbnail` | object | Thumbnail image details |
| ↳ `file_id` | string | Thumbnail file ID |
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
| ↳ `file_size` | number | Thumbnail file size in bytes |
| ↳ `width` | number | Thumbnail width in pixels | | ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels | | ↳ `height` | number | Thumbnail height in pixels |
| ↳ `thumbnail` | object | Thumbnail image details | | ↳ `thumb` | object | Secondary thumbnail details \(duplicate of thumbnail\) |
| ↳ `file_id` | string | Thumbnail file ID | | ↳ `file_id` | string | Thumbnail file ID |
| ↳ `file_unique_id` | string | Unique thumbnail file identifier | | ↳ `file_unique_id` | string | Unique thumbnail file identifier |
| ↳ `file_size` | number | Thumbnail file size in bytes | | ↳ `file_size` | number | Thumbnail file size in bytes |
@@ -371,32 +317,6 @@ Send animations (GIFs) to Telegram channels or users through the Telegram Bot AP
| ↳ `file_id` | string | Media file ID | | ↳ `file_id` | string | Media file ID |
| ↳ `file_unique_id` | string | Unique media file identifier | | ↳ `file_unique_id` | string | Unique media file identifier |
| ↳ `file_size` | number | Size of media file in bytes | | ↳ `file_size` | number | Size of media file in bytes |
| ↳ `thumb` | object | Secondary thumbnail details \(duplicate of thumbnail\) |
| ↳ `file_id` | string | Thumbnail file ID |
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
| ↳ `file_size` | number | Thumbnail file size in bytes |
| ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels |
| ↳ `file_name` | string | Document file name |
| ↳ `mime_type` | string | Document MIME type |
| ↳ `duration` | number | Duration of media in seconds |
| ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels |
| ↳ `thumbnail` | object | Document thumbnail information |
| ↳ `file_id` | string | Thumbnail file ID |
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
| ↳ `file_size` | number | Thumbnail file size in bytes |
| ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels |
| ↳ `file_id` | string | Document file ID |
| ↳ `file_unique_id` | string | Unique document file identifier |
| ↳ `file_size` | number | Size of document file in bytes |
| ↳ `thumb` | object | Duplicate thumbnail info \(used for compatibility\) |
| ↳ `file_id` | string | Thumbnail file ID |
| ↳ `file_unique_id` | string | Unique thumbnail file identifier |
| ↳ `file_size` | number | Thumbnail file size in bytes |
| ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels |
| ↳ `document` | object | Document file details if the message contains a document | | ↳ `document` | object | Document file details if the message contains a document |
| ↳ `file_name` | string | Document file name | | ↳ `file_name` | string | Document file name |
| ↳ `mime_type` | string | Document MIME type | | ↳ `mime_type` | string | Document MIME type |
@@ -406,17 +326,15 @@ Send animations (GIFs) to Telegram channels or users through the Telegram Bot AP
| ↳ `file_size` | number | Thumbnail file size in bytes | | ↳ `file_size` | number | Thumbnail file size in bytes |
| ↳ `width` | number | Thumbnail width in pixels | | ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels | | ↳ `height` | number | Thumbnail height in pixels |
| ↳ `file_id` | string | Document file ID |
| ↳ `file_unique_id` | string | Unique document file identifier |
| ↳ `file_size` | number | Size of document file in bytes |
| ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels |
| ↳ `thumb` | object | Duplicate thumbnail info \(used for compatibility\) | | ↳ `thumb` | object | Duplicate thumbnail info \(used for compatibility\) |
| ↳ `file_id` | string | Thumbnail file ID | | ↳ `file_id` | string | Thumbnail file ID |
| ↳ `file_unique_id` | string | Unique thumbnail file identifier | | ↳ `file_unique_id` | string | Unique thumbnail file identifier |
| ↳ `file_size` | number | Thumbnail file size in bytes | | ↳ `file_size` | number | Thumbnail file size in bytes |
| ↳ `width` | number | Thumbnail width in pixels | | ↳ `width` | number | Thumbnail width in pixels |
| ↳ `height` | number | Thumbnail height in pixels | | ↳ `height` | number | Thumbnail height in pixels |
| ↳ `file_id` | string | Document file ID |
| ↳ `file_unique_id` | string | Unique document file identifier |
| ↳ `file_size` | number | Size of document file in bytes |
### `telegram_send_document` ### `telegram_send_document`
@@ -443,16 +361,11 @@ Send documents (PDF, ZIP, DOC, etc.) to Telegram channels or users through the T
| ↳ `is_bot` | boolean | Whether the chat is a bot or not | | ↳ `is_bot` | boolean | Whether the chat is a bot or not |
| ↳ `first_name` | string | Sender | | ↳ `first_name` | string | Sender |
| ↳ `username` | string | Sender | | ↳ `username` | string | Sender |
| ↳ `id` | number | Chat ID |
| ↳ `is_bot` | boolean | Whether the chat is a bot or not |
| ↳ `first_name` | string | Chat first name \(if private chat\) |
| ↳ `username` | string | Chat username \(for private or channels\) |
| ↳ `chat` | object | Information about the chat where message was sent | | ↳ `chat` | object | Information about the chat where message was sent |
| ↳ `id` | number | Chat ID | | ↳ `id` | number | Chat ID |
| ↳ `first_name` | string | Chat first name \(if private chat\) | | ↳ `first_name` | string | Chat first name \(if private chat\) |
| ↳ `username` | string | Chat username \(for private or channels\) | | ↳ `username` | string | Chat username \(for private or channels\) |
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) | | ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
| ↳ `type` | string | Type of chat \(private, group, supergroup, or channel\) |
| ↳ `date` | number | Unix timestamp when the message was sent | | ↳ `date` | number | Unix timestamp when the message was sent |
| ↳ `document` | object | Document file details | | ↳ `document` | object | Document file details |
| ↳ `file_name` | string | Document file name | | ↳ `file_name` | string | Document file name |
@@ -460,10 +373,5 @@ Send documents (PDF, ZIP, DOC, etc.) to Telegram channels or users through the T
| ↳ `file_id` | string | Document file ID | | ↳ `file_id` | string | Document file ID |
| ↳ `file_unique_id` | string | Unique document file identifier | | ↳ `file_unique_id` | string | Unique document file identifier |
| ↳ `file_size` | number | Size of document file in bytes | | ↳ `file_size` | number | Size of document file in bytes |
| ↳ `file_name` | string | Document file name |
| ↳ `mime_type` | string | Document MIME type |
| ↳ `file_id` | string | Document file ID |
| ↳ `file_unique_id` | string | Unique document file identifier |
| ↳ `file_size` | number | Size of document file in bytes |

View File

@@ -63,7 +63,7 @@ Parse documents using AWS Textract OCR and document analysis
| `blocks` | array | Array of Block objects containing detected text, tables, forms, and other elements | | `blocks` | array | Array of Block objects containing detected text, tables, forms, and other elements |
| ↳ `BlockType` | string | Type of block \(PAGE, LINE, WORD, TABLE, CELL, KEY_VALUE_SET, etc.\) | | ↳ `BlockType` | string | Type of block \(PAGE, LINE, WORD, TABLE, CELL, KEY_VALUE_SET, etc.\) |
| ↳ `Id` | string | Unique identifier for the block | | ↳ `Id` | string | Unique identifier for the block |
| ↳ `Text` | string | Query text | | ↳ `Text` | string | The text content \(for LINE and WORD blocks\) |
| ↳ `TextType` | string | Type of text \(PRINTED or HANDWRITING\) | | ↳ `TextType` | string | Type of text \(PRINTED or HANDWRITING\) |
| ↳ `Confidence` | number | Confidence score \(0-100\) | | ↳ `Confidence` | number | Confidence score \(0-100\) |
| ↳ `Page` | number | Page number | | ↳ `Page` | number | Page number |
@@ -73,34 +73,12 @@ Parse documents using AWS Textract OCR and document analysis
| ↳ `Left` | number | Left position as ratio of document width | | ↳ `Left` | number | Left position as ratio of document width |
| ↳ `Top` | number | Top position as ratio of document height | | ↳ `Top` | number | Top position as ratio of document height |
| ↳ `Width` | number | Width as ratio of document width | | ↳ `Width` | number | Width as ratio of document width |
| ↳ `Height` | number | Height as ratio of document height |
| ↳ `Left` | number | Left position as ratio of document width |
| ↳ `Top` | number | Top position as ratio of document height |
| ↳ `Width` | number | Width as ratio of document width |
| ↳ `Polygon` | array | Polygon coordinates | | ↳ `Polygon` | array | Polygon coordinates |
| ↳ `X` | number | X coordinate | | ↳ `X` | number | X coordinate |
| ↳ `Y` | number | Y coordinate | | ↳ `Y` | number | Y coordinate |
| ↳ `X` | number | X coordinate |
| ↳ `Y` | number | Y coordinate |
| ↳ `BoundingBox` | object | Height as ratio of document height |
| ↳ `Height` | number | Height as ratio of document height |
| ↳ `Left` | number | Left position as ratio of document width |
| ↳ `Top` | number | Top position as ratio of document height |
| ↳ `Width` | number | Width as ratio of document width |
| ↳ `Height` | number | Height as ratio of document height |
| ↳ `Left` | number | Left position as ratio of document width |
| ↳ `Top` | number | Top position as ratio of document height |
| ↳ `Width` | number | Width as ratio of document width |
| ↳ `Polygon` | array | Polygon coordinates |
| ↳ `X` | number | X coordinate |
| ↳ `Y` | number | Y coordinate |
| ↳ `X` | number | X coordinate |
| ↳ `Y` | number | Y coordinate |
| ↳ `Relationships` | array | Relationships to other blocks | | ↳ `Relationships` | array | Relationships to other blocks |
| ↳ `Type` | string | Relationship type \(CHILD, VALUE, ANSWER, etc.\) | | ↳ `Type` | string | Relationship type \(CHILD, VALUE, ANSWER, etc.\) |
| ↳ `Ids` | array | IDs of related blocks | | ↳ `Ids` | array | IDs of related blocks |
| ↳ `Type` | string | Relationship type \(CHILD, VALUE, ANSWER, etc.\) |
| ↳ `Ids` | array | IDs of related blocks |
| ↳ `EntityTypes` | array | Entity types for KEY_VALUE_SET \(KEY or VALUE\) | | ↳ `EntityTypes` | array | Entity types for KEY_VALUE_SET \(KEY or VALUE\) |
| ↳ `SelectionStatus` | string | For checkboxes: SELECTED or NOT_SELECTED | | ↳ `SelectionStatus` | string | For checkboxes: SELECTED or NOT_SELECTED |
| ↳ `RowIndex` | number | Row index for table cells | | ↳ `RowIndex` | number | Row index for table cells |
@@ -111,8 +89,6 @@ Parse documents using AWS Textract OCR and document analysis
| ↳ `Text` | string | Query text | | ↳ `Text` | string | Query text |
| ↳ `Alias` | string | Query alias | | ↳ `Alias` | string | Query alias |
| ↳ `Pages` | array | Pages to search | | ↳ `Pages` | array | Pages to search |
| ↳ `Alias` | string | Query alias |
| ↳ `Pages` | array | Pages to search |
| `documentMetadata` | object | Metadata about the analyzed document | | `documentMetadata` | object | Metadata about the analyzed document |
| ↳ `pages` | number | Number of pages in the document | | ↳ `pages` | number | Number of pages in the document |
| `modelVersion` | string | Version of the Textract model used for processing | | `modelVersion` | string | Version of the Textract model used for processing |

View File

@@ -109,12 +109,6 @@ Retrieve insights and analytics for Typeform forms
| ↳ `responses_count` | number | Number of responses from this platform | | ↳ `responses_count` | number | Number of responses from this platform |
| ↳ `total_visits` | number | Total visits from this platform | | ↳ `total_visits` | number | Total visits from this platform |
| ↳ `unique_visits` | number | Unique visits from this platform | | ↳ `unique_visits` | number | Unique visits from this platform |
| ↳ `average_time` | number | Overall average completion time |
| ↳ `completion_rate` | number | Overall completion rate |
| ↳ `platform` | string | Platform name \(e.g., desktop, mobile\) |
| ↳ `responses_count` | number | Total number of responses |
| ↳ `total_visits` | number | Total number of visits |
| ↳ `unique_visits` | number | Total number of unique visits |
| ↳ `summary` | object | Overall average completion time | | ↳ `summary` | object | Overall average completion time |
| ↳ `average_time` | number | Overall average completion time | | ↳ `average_time` | number | Overall average completion time |
| ↳ `completion_rate` | number | Overall completion rate | | ↳ `completion_rate` | number | Overall completion rate |

View File

@@ -56,9 +56,6 @@ Read content from a Wealthbox note
| ↳ `itemId` | string | ID of the note | | ↳ `itemId` | string | ID of the note |
| ↳ `noteId` | string | ID of the note | | ↳ `noteId` | string | ID of the note |
| ↳ `itemType` | string | Type of item \(note\) | | ↳ `itemType` | string | Type of item \(note\) |
| ↳ `itemId` | string | ID of the note |
| ↳ `noteId` | string | ID of the note |
| ↳ `itemType` | string | Type of item \(note\) |
### `wealthbox_write_note` ### `wealthbox_write_note`
@@ -83,9 +80,6 @@ Create or update a Wealthbox note
| ↳ `itemId` | string | ID of the created/updated note | | ↳ `itemId` | string | ID of the created/updated note |
| ↳ `noteId` | string | ID of the created/updated note | | ↳ `noteId` | string | ID of the created/updated note |
| ↳ `itemType` | string | Type of item \(note\) | | ↳ `itemType` | string | Type of item \(note\) |
| ↳ `itemId` | string | ID of the created/updated note |
| ↳ `noteId` | string | ID of the created/updated note |
| ↳ `itemType` | string | Type of item \(note\) |
### `wealthbox_read_contact` ### `wealthbox_read_contact`
@@ -109,9 +103,6 @@ Read content from a Wealthbox contact
| ↳ `itemId` | string | ID of the contact | | ↳ `itemId` | string | ID of the contact |
| ↳ `contactId` | string | ID of the contact | | ↳ `contactId` | string | ID of the contact |
| ↳ `itemType` | string | Type of item \(contact\) | | ↳ `itemType` | string | Type of item \(contact\) |
| ↳ `itemId` | string | ID of the contact |
| ↳ `contactId` | string | ID of the contact |
| ↳ `itemType` | string | Type of item \(contact\) |
### `wealthbox_write_contact` ### `wealthbox_write_contact`
@@ -138,9 +129,6 @@ Create a new Wealthbox contact
| ↳ `itemId` | string | ID of the created/updated contact | | ↳ `itemId` | string | ID of the created/updated contact |
| ↳ `contactId` | string | ID of the created/updated contact | | ↳ `contactId` | string | ID of the created/updated contact |
| ↳ `itemType` | string | Type of item \(contact\) | | ↳ `itemType` | string | Type of item \(contact\) |
| ↳ `itemId` | string | ID of the created/updated contact |
| ↳ `contactId` | string | ID of the created/updated contact |
| ↳ `itemType` | string | Type of item \(contact\) |
### `wealthbox_read_task` ### `wealthbox_read_task`
@@ -164,9 +152,6 @@ Read content from a Wealthbox task
| ↳ `itemId` | string | ID of the task | | ↳ `itemId` | string | ID of the task |
| ↳ `taskId` | string | ID of the task | | ↳ `taskId` | string | ID of the task |
| ↳ `itemType` | string | Type of item \(task\) | | ↳ `itemType` | string | Type of item \(task\) |
| ↳ `itemId` | string | ID of the task |
| ↳ `taskId` | string | ID of the task |
| ↳ `itemType` | string | Type of item \(task\) |
### `wealthbox_write_task` ### `wealthbox_write_task`
@@ -193,8 +178,5 @@ Create or update a Wealthbox task
| ↳ `itemId` | string | ID of the created/updated task | | ↳ `itemId` | string | ID of the created/updated task |
| ↳ `taskId` | string | ID of the created/updated task | | ↳ `taskId` | string | ID of the created/updated task |
| ↳ `itemType` | string | Type of item \(task\) | | ↳ `itemType` | string | Type of item \(task\) |
| ↳ `itemId` | string | ID of the created/updated task |
| ↳ `taskId` | string | ID of the created/updated task |
| ↳ `itemType` | string | Type of item \(task\) |

View File

@@ -61,8 +61,6 @@ Post new tweets, reply to tweets, or create polls on X (Twitter)
| ↳ `attachments` | object | Media or poll attachments | | ↳ `attachments` | object | Media or poll attachments |
| ↳ `mediaKeys` | array | Media attachment keys | | ↳ `mediaKeys` | array | Media attachment keys |
| ↳ `pollId` | string | Poll ID if poll attached | | ↳ `pollId` | string | Poll ID if poll attached |
| ↳ `mediaKeys` | array | Media attachment keys |
| ↳ `pollId` | string | Poll ID if poll attached |
### `x_read` ### `x_read`
@@ -139,8 +137,5 @@ Get user profile information
| ↳ `followersCount` | number | Number of followers | | ↳ `followersCount` | number | Number of followers |
| ↳ `followingCount` | number | Number of users following | | ↳ `followingCount` | number | Number of users following |
| ↳ `tweetCount` | number | Total number of tweets | | ↳ `tweetCount` | number | Total number of tweets |
| ↳ `followersCount` | number | Number of followers |
| ↳ `followingCount` | number | Number of users following |
| ↳ `tweetCount` | number | Total number of tweets |

View File

@@ -10,6 +10,7 @@ describe('OAuth Token API Routes', () => {
const mockGetUserId = vi.fn() const mockGetUserId = vi.fn()
const mockGetCredential = vi.fn() const mockGetCredential = vi.fn()
const mockRefreshTokenIfNeeded = vi.fn() const mockRefreshTokenIfNeeded = vi.fn()
const mockGetOAuthToken = vi.fn()
const mockAuthorizeCredentialUse = vi.fn() const mockAuthorizeCredentialUse = vi.fn()
const mockCheckHybridAuth = vi.fn() const mockCheckHybridAuth = vi.fn()
@@ -29,6 +30,7 @@ describe('OAuth Token API Routes', () => {
getUserId: mockGetUserId, getUserId: mockGetUserId,
getCredential: mockGetCredential, getCredential: mockGetCredential,
refreshTokenIfNeeded: mockRefreshTokenIfNeeded, refreshTokenIfNeeded: mockRefreshTokenIfNeeded,
getOAuthToken: mockGetOAuthToken,
})) }))
vi.doMock('@sim/logger', () => ({ vi.doMock('@sim/logger', () => ({
@@ -230,6 +232,140 @@ describe('OAuth Token API Routes', () => {
expect(response.status).toBe(401) expect(response.status).toBe(401)
expect(data).toHaveProperty('error', 'Failed to refresh access token') expect(data).toHaveProperty('error', 'Failed to refresh access token')
}) })
describe('credentialAccountUserId + providerId path', () => {
it('should reject unauthenticated requests', async () => {
mockCheckHybridAuth.mockResolvedValueOnce({
success: false,
error: 'Authentication required',
})
const req = createMockRequest('POST', {
credentialAccountUserId: 'target-user-id',
providerId: 'google',
})
const { POST } = await import('@/app/api/auth/oauth/token/route')
const response = await POST(req)
const data = await response.json()
expect(response.status).toBe(401)
expect(data).toHaveProperty('error', 'User not authenticated')
expect(mockGetOAuthToken).not.toHaveBeenCalled()
})
it('should reject API key authentication', async () => {
mockCheckHybridAuth.mockResolvedValueOnce({
success: true,
authType: 'api_key',
userId: 'test-user-id',
})
const req = createMockRequest('POST', {
credentialAccountUserId: 'test-user-id',
providerId: 'google',
})
const { POST } = await import('@/app/api/auth/oauth/token/route')
const response = await POST(req)
const data = await response.json()
expect(response.status).toBe(401)
expect(data).toHaveProperty('error', 'User not authenticated')
expect(mockGetOAuthToken).not.toHaveBeenCalled()
})
it('should reject internal JWT authentication', async () => {
mockCheckHybridAuth.mockResolvedValueOnce({
success: true,
authType: 'internal_jwt',
userId: 'test-user-id',
})
const req = createMockRequest('POST', {
credentialAccountUserId: 'test-user-id',
providerId: 'google',
})
const { POST } = await import('@/app/api/auth/oauth/token/route')
const response = await POST(req)
const data = await response.json()
expect(response.status).toBe(401)
expect(data).toHaveProperty('error', 'User not authenticated')
expect(mockGetOAuthToken).not.toHaveBeenCalled()
})
it('should reject requests for other users credentials', async () => {
mockCheckHybridAuth.mockResolvedValueOnce({
success: true,
authType: 'session',
userId: 'attacker-user-id',
})
const req = createMockRequest('POST', {
credentialAccountUserId: 'victim-user-id',
providerId: 'google',
})
const { POST } = await import('@/app/api/auth/oauth/token/route')
const response = await POST(req)
const data = await response.json()
expect(response.status).toBe(403)
expect(data).toHaveProperty('error', 'Unauthorized')
expect(mockGetOAuthToken).not.toHaveBeenCalled()
})
it('should allow session-authenticated users to access their own credentials', async () => {
mockCheckHybridAuth.mockResolvedValueOnce({
success: true,
authType: 'session',
userId: 'test-user-id',
})
mockGetOAuthToken.mockResolvedValueOnce('valid-access-token')
const req = createMockRequest('POST', {
credentialAccountUserId: 'test-user-id',
providerId: 'google',
})
const { POST } = await import('@/app/api/auth/oauth/token/route')
const response = await POST(req)
const data = await response.json()
expect(response.status).toBe(200)
expect(data).toHaveProperty('accessToken', 'valid-access-token')
expect(mockGetOAuthToken).toHaveBeenCalledWith('test-user-id', 'google')
})
it('should return 404 when credential not found for user', async () => {
mockCheckHybridAuth.mockResolvedValueOnce({
success: true,
authType: 'session',
userId: 'test-user-id',
})
mockGetOAuthToken.mockResolvedValueOnce(null)
const req = createMockRequest('POST', {
credentialAccountUserId: 'test-user-id',
providerId: 'nonexistent-provider',
})
const { POST } = await import('@/app/api/auth/oauth/token/route')
const response = await POST(req)
const data = await response.json()
expect(response.status).toBe(404)
expect(data.error).toContain('No credential found')
})
})
}) })
/** /**

View File

@@ -71,6 +71,22 @@ export async function POST(request: NextRequest) {
providerId, providerId,
}) })
const auth = await checkHybridAuth(request, { requireWorkflowId: false })
if (!auth.success || auth.authType !== 'session' || !auth.userId) {
logger.warn(`[${requestId}] Unauthorized request for credentialAccountUserId path`, {
success: auth.success,
authType: auth.authType,
})
return NextResponse.json({ error: 'User not authenticated' }, { status: 401 })
}
if (auth.userId !== credentialAccountUserId) {
logger.warn(
`[${requestId}] User ${auth.userId} attempted to access credentials for ${credentialAccountUserId}`
)
return NextResponse.json({ error: 'Unauthorized' }, { status: 403 })
}
try { try {
const accessToken = await getOAuthToken(credentialAccountUserId, providerId) const accessToken = await getOAuthToken(credentialAccountUserId, providerId)
if (!accessToken) { if (!accessToken) {

View File

@@ -26,8 +26,9 @@ vi.mock('@/serializer', () => ({
Serializer: vi.fn(), Serializer: vi.fn(),
})) }))
vi.mock('@/stores/workflows/server-utils', () => ({ vi.mock('@/lib/workflows/subblocks', () => ({
mergeSubblockState: vi.fn().mockReturnValue({}), mergeSubblockStateWithValues: vi.fn().mockReturnValue({}),
mergeSubBlockValues: vi.fn().mockReturnValue({}),
})) }))
const mockDecryptSecret = vi.fn() const mockDecryptSecret = vi.fn()

View File

@@ -1,13 +1,19 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { validateAlphanumericId } from '@/lib/core/security/input-validation'
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
const logger = createLogger('AsanaAddCommentAPI') const logger = createLogger('AsanaAddCommentAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { accessToken, taskGid, text } = await request.json() const { accessToken, taskGid, text } = await request.json()
if (!accessToken) { if (!accessToken) {

View File

@@ -1,13 +1,19 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { validateAlphanumericId } from '@/lib/core/security/input-validation'
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
const logger = createLogger('AsanaCreateTaskAPI') const logger = createLogger('AsanaCreateTaskAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { accessToken, workspace, name, notes, assignee, due_on } = await request.json() const { accessToken, workspace, name, notes, assignee, due_on } = await request.json()
if (!accessToken) { if (!accessToken) {

View File

@@ -1,13 +1,19 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { validateAlphanumericId } from '@/lib/core/security/input-validation'
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
const logger = createLogger('AsanaGetProjectsAPI') const logger = createLogger('AsanaGetProjectsAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { accessToken, workspace } = await request.json() const { accessToken, workspace } = await request.json()
if (!accessToken) { if (!accessToken) {

View File

@@ -1,13 +1,19 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { validateAlphanumericId } from '@/lib/core/security/input-validation'
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
const logger = createLogger('AsanaGetTaskAPI') const logger = createLogger('AsanaGetTaskAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { accessToken, taskGid, workspace, project, limit } = await request.json() const { accessToken, taskGid, workspace, project, limit } = await request.json()
if (!accessToken) { if (!accessToken) {

View File

@@ -1,13 +1,19 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { validateAlphanumericId } from '@/lib/core/security/input-validation'
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
const logger = createLogger('AsanaSearchTasksAPI') const logger = createLogger('AsanaSearchTasksAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { accessToken, workspace, text, assignee, projects, completed } = await request.json() const { accessToken, workspace, text, assignee, projects, completed } = await request.json()
if (!accessToken) { if (!accessToken) {

View File

@@ -1,13 +1,19 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { validateAlphanumericId } from '@/lib/core/security/input-validation'
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
const logger = createLogger('AsanaUpdateTaskAPI') const logger = createLogger('AsanaUpdateTaskAPI')
export async function PUT(request: Request) { export async function PUT(request: NextRequest) {
try { try {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { accessToken, taskGid, name, notes, assignee, completed, due_on } = await request.json() const { accessToken, taskGid, name, notes, assignee, completed, due_on } = await request.json()
if (!accessToken) { if (!accessToken) {

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getConfluenceCloudId } from '@/tools/confluence/utils' import { getConfluenceCloudId } from '@/tools/confluence/utils'
@@ -8,8 +9,13 @@ const logger = createLogger('ConfluenceAttachmentAPI')
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
// Delete an attachment // Delete an attachment
export async function DELETE(request: Request) { export async function DELETE(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { domain, accessToken, cloudId: providedCloudId, attachmentId } = await request.json() const { domain, accessToken, cloudId: providedCloudId, attachmentId } = await request.json()
if (!domain) { if (!domain) {

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getConfluenceCloudId } from '@/tools/confluence/utils' import { getConfluenceCloudId } from '@/tools/confluence/utils'
@@ -8,8 +9,13 @@ const logger = createLogger('ConfluenceAttachmentsAPI')
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
// List attachments on a page // List attachments on a page
export async function GET(request: Request) { export async function GET(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { searchParams } = new URL(request.url) const { searchParams } = new URL(request.url)
const domain = searchParams.get('domain') const domain = searchParams.get('domain')
const accessToken = searchParams.get('accessToken') const accessToken = searchParams.get('accessToken')

View File

@@ -1,6 +1,7 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getConfluenceCloudId } from '@/tools/confluence/utils' import { getConfluenceCloudId } from '@/tools/confluence/utils'
@@ -46,8 +47,13 @@ const deleteCommentSchema = z
) )
// Update a comment // Update a comment
export async function PUT(request: Request) { export async function PUT(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const body = await request.json() const body = await request.json()
const validation = putCommentSchema.safeParse(body) const validation = putCommentSchema.safeParse(body)
@@ -128,8 +134,13 @@ export async function PUT(request: Request) {
} }
// Delete a comment // Delete a comment
export async function DELETE(request: Request) { export async function DELETE(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const body = await request.json() const body = await request.json()
const validation = deleteCommentSchema.safeParse(body) const validation = deleteCommentSchema.safeParse(body)

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getConfluenceCloudId } from '@/tools/confluence/utils' import { getConfluenceCloudId } from '@/tools/confluence/utils'
@@ -8,8 +9,13 @@ const logger = createLogger('ConfluenceCommentsAPI')
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
// Create a comment // Create a comment
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { domain, accessToken, cloudId: providedCloudId, pageId, comment } = await request.json() const { domain, accessToken, cloudId: providedCloudId, pageId, comment } = await request.json()
if (!domain) { if (!domain) {
@@ -86,8 +92,13 @@ export async function POST(request: Request) {
} }
// List comments on a page // List comments on a page
export async function GET(request: Request) { export async function GET(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { searchParams } = new URL(request.url) const { searchParams } = new URL(request.url)
const domain = searchParams.get('domain') const domain = searchParams.get('domain')
const accessToken = searchParams.get('accessToken') const accessToken = searchParams.get('accessToken')

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getConfluenceCloudId } from '@/tools/confluence/utils' import { getConfluenceCloudId } from '@/tools/confluence/utils'
@@ -7,8 +8,13 @@ const logger = createLogger('ConfluenceCreatePageAPI')
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { const {
domain, domain,
accessToken, accessToken,

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getConfluenceCloudId } from '@/tools/confluence/utils' import { getConfluenceCloudId } from '@/tools/confluence/utils'
@@ -8,8 +9,13 @@ const logger = createLogger('ConfluenceLabelsAPI')
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
// Add a label to a page // Add a label to a page
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { const {
domain, domain,
accessToken, accessToken,
@@ -87,8 +93,13 @@ export async function POST(request: Request) {
} }
// List labels on a page // List labels on a page
export async function GET(request: Request) { export async function GET(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { searchParams } = new URL(request.url) const { searchParams } = new URL(request.url)
const domain = searchParams.get('domain') const domain = searchParams.get('domain')
const accessToken = searchParams.get('accessToken') const accessToken = searchParams.get('accessToken')

View File

@@ -1,6 +1,7 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getConfluenceCloudId } from '@/tools/confluence/utils' import { getConfluenceCloudId } from '@/tools/confluence/utils'
@@ -73,8 +74,13 @@ const deletePageSchema = z
} }
) )
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const body = await request.json() const body = await request.json()
const validation = postPageSchema.safeParse(body) const validation = postPageSchema.safeParse(body)
@@ -144,8 +150,13 @@ export async function POST(request: Request) {
} }
} }
export async function PUT(request: Request) { export async function PUT(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const body = await request.json() const body = await request.json()
const validation = putPageSchema.safeParse(body) const validation = putPageSchema.safeParse(body)
@@ -248,8 +259,13 @@ export async function PUT(request: Request) {
} }
} }
export async function DELETE(request: Request) { export async function DELETE(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const body = await request.json() const body = await request.json()
const validation = deletePageSchema.safeParse(body) const validation = deletePageSchema.safeParse(body)

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getConfluenceCloudId } from '@/tools/confluence/utils' import { getConfluenceCloudId } from '@/tools/confluence/utils'
@@ -8,8 +9,13 @@ const logger = createLogger('ConfluencePagesAPI')
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
// List pages or search pages // List pages or search pages
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { const {
domain, domain,
accessToken, accessToken,

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getConfluenceCloudId } from '@/tools/confluence/utils' import { getConfluenceCloudId } from '@/tools/confluence/utils'
@@ -7,8 +8,13 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('Confluence Search') const logger = createLogger('Confluence Search')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { const {
domain, domain,
accessToken, accessToken,

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getConfluenceCloudId } from '@/tools/confluence/utils' import { getConfluenceCloudId } from '@/tools/confluence/utils'
@@ -8,8 +9,13 @@ const logger = createLogger('ConfluenceSpaceAPI')
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
// Get a specific space // Get a specific space
export async function GET(request: Request) { export async function GET(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { searchParams } = new URL(request.url) const { searchParams } = new URL(request.url)
const domain = searchParams.get('domain') const domain = searchParams.get('domain')
const accessToken = searchParams.get('accessToken') const accessToken = searchParams.get('accessToken')

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getConfluenceCloudId } from '@/tools/confluence/utils' import { getConfluenceCloudId } from '@/tools/confluence/utils'
@@ -8,8 +9,13 @@ const logger = createLogger('ConfluenceSpacesAPI')
export const dynamic = 'force-dynamic' export const dynamic = 'force-dynamic'
// List all spaces // List all spaces
export async function GET(request: Request) { export async function GET(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { searchParams } = new URL(request.url) const { searchParams } = new URL(request.url)
const domain = searchParams.get('domain') const domain = searchParams.get('domain')
const accessToken = searchParams.get('accessToken') const accessToken = searchParams.get('accessToken')

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { processSingleFileToUserFile } from '@/lib/uploads/utils/file-utils' import { processSingleFileToUserFile } from '@/lib/uploads/utils/file-utils'
import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server'
@@ -11,6 +12,11 @@ export const dynamic = 'force-dynamic'
export async function POST(request: NextRequest) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const body = await request.json() const body = await request.json()
const { domain, accessToken, cloudId: providedCloudId, pageId, file, fileName, comment } = body const { domain, accessToken, cloudId: providedCloudId, pageId, file, fileName, comment } = body

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateNumericId } from '@/lib/core/security/input-validation' import { validateNumericId } from '@/lib/core/security/input-validation'
interface DiscordChannel { interface DiscordChannel {
@@ -13,7 +14,12 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('DiscordChannelsAPI') const logger = createLogger('DiscordChannelsAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const { botToken, serverId, channelId } = await request.json() const { botToken, serverId, channelId } = await request.json()

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateNumericId } from '@/lib/core/security/input-validation' import { validateNumericId } from '@/lib/core/security/input-validation'
interface DiscordServer { interface DiscordServer {
@@ -12,7 +13,12 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('DiscordServersAPI') const logger = createLogger('DiscordServersAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const { botToken, serverId } = await request.json() const { botToken, serverId } = await request.json()

View File

@@ -1,6 +1,7 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { authorizeCredentialUse } from '@/lib/auth/credential-access' import { authorizeCredentialUse } from '@/lib/auth/credential-access'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { validateAlphanumericId } from '@/lib/core/security/input-validation'
import { generateRequestId } from '@/lib/core/utils/request' import { generateRequestId } from '@/lib/core/utils/request'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
@@ -15,6 +16,11 @@ export async function GET(request: NextRequest) {
const requestId = generateRequestId() const requestId = generateRequestId()
logger.info(`[${requestId}] Google Drive file request received`) logger.info(`[${requestId}] Google Drive file request received`)
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const { searchParams } = new URL(request.url) const { searchParams } = new URL(request.url)
const credentialId = searchParams.get('credentialId') const credentialId = searchParams.get('credentialId')

View File

@@ -1,7 +1,7 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { authorizeCredentialUse } from '@/lib/auth/credential-access' import { authorizeCredentialUse } from '@/lib/auth/credential-access'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { validateAlphanumericId } from '@/lib/core/security/input-validation'
import { generateRequestId } from '@/lib/core/utils/request' import { generateRequestId } from '@/lib/core/utils/request'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
@@ -73,14 +73,12 @@ export async function GET(request: NextRequest) {
const requestId = generateRequestId() const requestId = generateRequestId()
logger.info(`[${requestId}] Google Drive files request received`) logger.info(`[${requestId}] Google Drive files request received`)
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const session = await getSession()
if (!session?.user?.id) {
logger.warn(`[${requestId}] Unauthenticated request rejected`)
return NextResponse.json({ error: 'User not authenticated' }, { status: 401 })
}
const { searchParams } = new URL(request.url) const { searchParams } = new URL(request.url)
const credentialId = searchParams.get('credentialId') const credentialId = searchParams.get('credentialId')
const mimeType = searchParams.get('mimeType') const mimeType = searchParams.get('mimeType')

View File

@@ -1,5 +1,6 @@
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { createDynamoDBClient, deleteItem } from '@/app/api/tools/dynamodb/utils' import { createDynamoDBClient, deleteItem } from '@/app/api/tools/dynamodb/utils'
const DeleteSchema = z.object({ const DeleteSchema = z.object({
@@ -13,8 +14,13 @@ const DeleteSchema = z.object({
conditionExpression: z.string().optional(), conditionExpression: z.string().optional(),
}) })
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const body = await request.json() const body = await request.json()
const validatedData = DeleteSchema.parse(body) const validatedData = DeleteSchema.parse(body)

View File

@@ -1,5 +1,6 @@
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { createDynamoDBClient, getItem } from '@/app/api/tools/dynamodb/utils' import { createDynamoDBClient, getItem } from '@/app/api/tools/dynamodb/utils'
const GetSchema = z.object({ const GetSchema = z.object({
@@ -19,8 +20,13 @@ const GetSchema = z.object({
}), }),
}) })
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const body = await request.json() const body = await request.json()
const validatedData = GetSchema.parse(body) const validatedData = GetSchema.parse(body)

View File

@@ -2,6 +2,7 @@ import { randomUUID } from 'crypto'
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { createRawDynamoDBClient, describeTable, listTables } from '@/app/api/tools/dynamodb/utils' import { createRawDynamoDBClient, describeTable, listTables } from '@/app/api/tools/dynamodb/utils'
const logger = createLogger('DynamoDBIntrospectAPI') const logger = createLogger('DynamoDBIntrospectAPI')
@@ -17,6 +18,11 @@ export async function POST(request: NextRequest) {
const requestId = randomUUID().slice(0, 8) const requestId = randomUUID().slice(0, 8)
try { try {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const body = await request.json() const body = await request.json()
const params = IntrospectSchema.parse(body) const params = IntrospectSchema.parse(body)

View File

@@ -1,5 +1,6 @@
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { createDynamoDBClient, putItem } from '@/app/api/tools/dynamodb/utils' import { createDynamoDBClient, putItem } from '@/app/api/tools/dynamodb/utils'
const PutSchema = z.object({ const PutSchema = z.object({
@@ -12,8 +13,13 @@ const PutSchema = z.object({
}), }),
}) })
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const body = await request.json() const body = await request.json()
const validatedData = PutSchema.parse(body) const validatedData = PutSchema.parse(body)

View File

@@ -1,5 +1,6 @@
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { createDynamoDBClient, queryItems } from '@/app/api/tools/dynamodb/utils' import { createDynamoDBClient, queryItems } from '@/app/api/tools/dynamodb/utils'
const QuerySchema = z.object({ const QuerySchema = z.object({
@@ -15,8 +16,13 @@ const QuerySchema = z.object({
limit: z.number().positive().optional(), limit: z.number().positive().optional(),
}) })
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const body = await request.json() const body = await request.json()
const validatedData = QuerySchema.parse(body) const validatedData = QuerySchema.parse(body)

View File

@@ -1,5 +1,6 @@
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { createDynamoDBClient, scanItems } from '@/app/api/tools/dynamodb/utils' import { createDynamoDBClient, scanItems } from '@/app/api/tools/dynamodb/utils'
const ScanSchema = z.object({ const ScanSchema = z.object({
@@ -14,8 +15,13 @@ const ScanSchema = z.object({
limit: z.number().positive().optional(), limit: z.number().positive().optional(),
}) })
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const body = await request.json() const body = await request.json()
const validatedData = ScanSchema.parse(body) const validatedData = ScanSchema.parse(body)

View File

@@ -1,5 +1,6 @@
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { createDynamoDBClient, updateItem } from '@/app/api/tools/dynamodb/utils' import { createDynamoDBClient, updateItem } from '@/app/api/tools/dynamodb/utils'
const UpdateSchema = z.object({ const UpdateSchema = z.object({
@@ -16,8 +17,13 @@ const UpdateSchema = z.object({
conditionExpression: z.string().optional(), conditionExpression: z.string().optional(),
}) })
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const body = await request.json() const body = await request.json()
const validatedData = UpdateSchema.parse(body) const validatedData = UpdateSchema.parse(body)

View File

@@ -1,6 +1,7 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { authorizeCredentialUse } from '@/lib/auth/credential-access' import { authorizeCredentialUse } from '@/lib/auth/credential-access'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { generateRequestId } from '@/lib/core/utils/request' import { generateRequestId } from '@/lib/core/utils/request'
import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
@@ -29,6 +30,11 @@ export async function GET(request: NextRequest) {
const requestId = generateRequestId() const requestId = generateRequestId()
logger.info(`[${requestId}] Google Sheets sheets request received`) logger.info(`[${requestId}] Google Sheets sheets request received`)
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const { searchParams } = new URL(request.url) const { searchParams } = new URL(request.url)
const credentialId = searchParams.get('credentialId') const credentialId = searchParams.get('credentialId')

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation'
import { getJiraCloudId } from '@/tools/jira/utils' import { getJiraCloudId } from '@/tools/jira/utils'
@@ -7,8 +8,13 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('JiraIssueAPI') const logger = createLogger('JiraIssueAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { domain, accessToken, issueId, cloudId: providedCloudId } = await request.json() const { domain, accessToken, issueId, cloudId: providedCloudId } = await request.json()
if (!domain) { if (!domain) {
logger.error('Missing domain in request') logger.error('Missing domain in request')

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getJiraCloudId } from '@/tools/jira/utils' import { getJiraCloudId } from '@/tools/jira/utils'
@@ -26,8 +27,13 @@ const validateRequiredParams = (domain: string | null, accessToken: string | nul
return null return null
} }
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { domain, accessToken, issueKeys = [], cloudId: providedCloudId } = await request.json() const { domain, accessToken, issueKeys = [], cloudId: providedCloudId } = await request.json()
const validationError = validateRequiredParams(domain || null, accessToken || null) const validationError = validateRequiredParams(domain || null, accessToken || null)
@@ -101,8 +107,13 @@ export async function POST(request: Request) {
} }
} }
export async function GET(request: Request) { export async function GET(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const url = new URL(request.url) const url = new URL(request.url)
const domain = url.searchParams.get('domain')?.trim() const domain = url.searchParams.get('domain')?.trim()
const accessToken = url.searchParams.get('accessToken') const accessToken = url.searchParams.get('accessToken')

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getJiraCloudId } from '@/tools/jira/utils' import { getJiraCloudId } from '@/tools/jira/utils'
@@ -7,8 +8,13 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('JiraProjectsAPI') const logger = createLogger('JiraProjectsAPI')
export async function GET(request: Request) { export async function GET(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const url = new URL(request.url) const url = new URL(request.url)
const domain = url.searchParams.get('domain')?.trim() const domain = url.searchParams.get('domain')?.trim()
const accessToken = url.searchParams.get('accessToken') const accessToken = url.searchParams.get('accessToken')
@@ -98,8 +104,13 @@ export async function GET(request: Request) {
} }
} }
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { domain, accessToken, projectId, cloudId: providedCloudId } = await request.json() const { domain, accessToken, projectId, cloudId: providedCloudId } = await request.json()
if (!domain) { if (!domain) {

View File

@@ -1,6 +1,7 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation'
import { getJiraCloudId } from '@/tools/jira/utils' import { getJiraCloudId } from '@/tools/jira/utils'
@@ -21,8 +22,13 @@ const jiraUpdateSchema = z.object({
cloudId: z.string().optional(), cloudId: z.string().optional(),
}) })
export async function PUT(request: Request) { export async function PUT(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const body = await request.json() const body = await request.json()
const validation = jiraUpdateSchema.safeParse(body) const validation = jiraUpdateSchema.safeParse(body)

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getJiraCloudId } from '@/tools/jira/utils' import { getJiraCloudId } from '@/tools/jira/utils'
@@ -7,8 +8,13 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('JiraWriteAPI') const logger = createLogger('JiraWriteAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
try { try {
const auth = await checkSessionOrInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
const { const {
domain, domain,
accessToken, accessToken,

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { import {
validateAlphanumericId, validateAlphanumericId,
validateEnum, validateEnum,
@@ -15,7 +16,12 @@ const logger = createLogger('JsmApprovalsAPI')
const VALID_ACTIONS = ['get', 'answer'] as const const VALID_ACTIONS = ['get', 'answer'] as const
const VALID_DECISIONS = ['approve', 'decline'] as const const VALID_DECISIONS = ['approve', 'decline'] as const
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const { const {

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation'
import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils'
@@ -7,7 +8,12 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('JsmCommentAPI') const logger = createLogger('JsmCommentAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const { const {
domain, domain,

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation'
import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils'
@@ -7,7 +8,12 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('JsmCommentsAPI') const logger = createLogger('JsmCommentsAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const { const {

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils'
@@ -7,7 +8,12 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('JsmCustomersAPI') const logger = createLogger('JsmCustomersAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const { const {

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { import {
validateAlphanumericId, validateAlphanumericId,
validateEnum, validateEnum,
@@ -13,7 +14,12 @@ const logger = createLogger('JsmOrganizationAPI')
const VALID_ACTIONS = ['create', 'add_to_service_desk'] as const const VALID_ACTIONS = ['create', 'add_to_service_desk'] as const
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const { const {

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils'
@@ -7,7 +8,12 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('JsmOrganizationsAPI') const logger = createLogger('JsmOrganizationsAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const { domain, accessToken, cloudId: cloudIdParam, serviceDeskId, start, limit } = body const { domain, accessToken, cloudId: cloudIdParam, serviceDeskId, start, limit } = body

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { import {
validateEnum, validateEnum,
validateJiraCloudId, validateJiraCloudId,
@@ -13,7 +14,12 @@ const logger = createLogger('JsmParticipantsAPI')
const VALID_ACTIONS = ['get', 'add'] as const const VALID_ACTIONS = ['get', 'add'] as const
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const { const {

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils'
@@ -7,7 +8,12 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('JsmQueuesAPI') const logger = createLogger('JsmQueuesAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const { const {

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { import {
validateAlphanumericId, validateAlphanumericId,
validateJiraCloudId, validateJiraCloudId,
@@ -11,7 +12,12 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('JsmRequestAPI') const logger = createLogger('JsmRequestAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const { const {

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils'
@@ -7,7 +8,12 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('JsmRequestsAPI') const logger = createLogger('JsmRequestsAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const { const {

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils'
@@ -7,7 +8,12 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('JsmRequestTypesAPI') const logger = createLogger('JsmRequestTypesAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const { domain, accessToken, cloudId: cloudIdParam, serviceDeskId, start, limit } = body const { domain, accessToken, cloudId: cloudIdParam, serviceDeskId, start, limit } = body

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateJiraCloudId } from '@/lib/core/security/input-validation' import { validateJiraCloudId } from '@/lib/core/security/input-validation'
import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils'
@@ -7,7 +8,12 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('JsmServiceDesksAPI') const logger = createLogger('JsmServiceDesksAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const { domain, accessToken, cloudId: cloudIdParam, start, limit } = body const { domain, accessToken, cloudId: cloudIdParam, start, limit } = body

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation'
import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils'
@@ -7,7 +8,12 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('JsmSlaAPI') const logger = createLogger('JsmSlaAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const { domain, accessToken, cloudId: cloudIdParam, issueIdOrKey, start, limit } = body const { domain, accessToken, cloudId: cloudIdParam, issueIdOrKey, start, limit } = body

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { import {
validateAlphanumericId, validateAlphanumericId,
validateJiraCloudId, validateJiraCloudId,
@@ -11,7 +12,12 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('JsmTransitionAPI') const logger = createLogger('JsmTransitionAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const { const {
domain, domain,

View File

@@ -1,5 +1,6 @@
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation'
import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' import { getJiraCloudId, getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils'
@@ -7,7 +8,12 @@ export const dynamic = 'force-dynamic'
const logger = createLogger('JsmTransitionsAPI') const logger = createLogger('JsmTransitionsAPI')
export async function POST(request: Request) { export async function POST(request: NextRequest) {
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const { domain, accessToken, cloudId: cloudIdParam, issueIdOrKey } = body const { domain, accessToken, cloudId: cloudIdParam, issueIdOrKey } = body

View File

@@ -2,6 +2,7 @@ import { randomUUID } from 'crypto'
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { createMongoDBConnection, sanitizeCollectionName, validateFilter } from '../utils' import { createMongoDBConnection, sanitizeCollectionName, validateFilter } from '../utils'
const logger = createLogger('MongoDBDeleteAPI') const logger = createLogger('MongoDBDeleteAPI')
@@ -40,6 +41,12 @@ export async function POST(request: NextRequest) {
const requestId = randomUUID().slice(0, 8) const requestId = randomUUID().slice(0, 8)
let client = null let client = null
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
logger.warn(`[${requestId}] Unauthorized MongoDB delete attempt`)
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const params = DeleteSchema.parse(body) const params = DeleteSchema.parse(body)

View File

@@ -2,6 +2,7 @@ import { randomUUID } from 'crypto'
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { createMongoDBConnection, sanitizeCollectionName, validatePipeline } from '../utils' import { createMongoDBConnection, sanitizeCollectionName, validatePipeline } from '../utils'
const logger = createLogger('MongoDBExecuteAPI') const logger = createLogger('MongoDBExecuteAPI')
@@ -32,6 +33,12 @@ export async function POST(request: NextRequest) {
const requestId = randomUUID().slice(0, 8) const requestId = randomUUID().slice(0, 8)
let client = null let client = null
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
logger.warn(`[${requestId}] Unauthorized MongoDB execute attempt`)
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const params = ExecuteSchema.parse(body) const params = ExecuteSchema.parse(body)

View File

@@ -2,6 +2,7 @@ import { randomUUID } from 'crypto'
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { createMongoDBConnection, sanitizeCollectionName } from '../utils' import { createMongoDBConnection, sanitizeCollectionName } from '../utils'
const logger = createLogger('MongoDBInsertAPI') const logger = createLogger('MongoDBInsertAPI')
@@ -37,6 +38,12 @@ export async function POST(request: NextRequest) {
const requestId = randomUUID().slice(0, 8) const requestId = randomUUID().slice(0, 8)
let client = null let client = null
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
logger.warn(`[${requestId}] Unauthorized MongoDB insert attempt`)
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const params = InsertSchema.parse(body) const params = InsertSchema.parse(body)

View File

@@ -2,6 +2,7 @@ import { randomUUID } from 'crypto'
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { createMongoDBConnection, executeIntrospect } from '../utils' import { createMongoDBConnection, executeIntrospect } from '../utils'
const logger = createLogger('MongoDBIntrospectAPI') const logger = createLogger('MongoDBIntrospectAPI')
@@ -20,6 +21,12 @@ export async function POST(request: NextRequest) {
const requestId = randomUUID().slice(0, 8) const requestId = randomUUID().slice(0, 8)
let client = null let client = null
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
logger.warn(`[${requestId}] Unauthorized MongoDB introspect attempt`)
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const params = IntrospectSchema.parse(body) const params = IntrospectSchema.parse(body)

View File

@@ -2,6 +2,7 @@ import { randomUUID } from 'crypto'
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { createMongoDBConnection, sanitizeCollectionName, validateFilter } from '../utils' import { createMongoDBConnection, sanitizeCollectionName, validateFilter } from '../utils'
const logger = createLogger('MongoDBQueryAPI') const logger = createLogger('MongoDBQueryAPI')
@@ -49,6 +50,12 @@ export async function POST(request: NextRequest) {
const requestId = randomUUID().slice(0, 8) const requestId = randomUUID().slice(0, 8)
let client = null let client = null
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
logger.warn(`[${requestId}] Unauthorized MongoDB query attempt`)
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const params = QuerySchema.parse(body) const params = QuerySchema.parse(body)

View File

@@ -2,6 +2,7 @@ import { randomUUID } from 'crypto'
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { createMongoDBConnection, sanitizeCollectionName, validateFilter } from '../utils' import { createMongoDBConnection, sanitizeCollectionName, validateFilter } from '../utils'
const logger = createLogger('MongoDBUpdateAPI') const logger = createLogger('MongoDBUpdateAPI')
@@ -59,6 +60,12 @@ export async function POST(request: NextRequest) {
const requestId = randomUUID().slice(0, 8) const requestId = randomUUID().slice(0, 8)
let client = null let client = null
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
logger.warn(`[${requestId}] Unauthorized MongoDB update attempt`)
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const params = UpdateSchema.parse(body) const params = UpdateSchema.parse(body)

View File

@@ -2,6 +2,7 @@ import { randomUUID } from 'crypto'
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { import {
convertNeo4jTypesToJSON, convertNeo4jTypesToJSON,
createNeo4jDriver, createNeo4jDriver,
@@ -26,6 +27,12 @@ export async function POST(request: NextRequest) {
let driver = null let driver = null
let session = null let session = null
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
logger.warn(`[${requestId}] Unauthorized Neo4j create attempt`)
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const params = CreateSchema.parse(body) const params = CreateSchema.parse(body)

View File

@@ -2,6 +2,7 @@ import { randomUUID } from 'crypto'
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { createNeo4jDriver, validateCypherQuery } from '@/app/api/tools/neo4j/utils' import { createNeo4jDriver, validateCypherQuery } from '@/app/api/tools/neo4j/utils'
const logger = createLogger('Neo4jDeleteAPI') const logger = createLogger('Neo4jDeleteAPI')
@@ -23,6 +24,12 @@ export async function POST(request: NextRequest) {
let driver = null let driver = null
let session = null let session = null
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
logger.warn(`[${requestId}] Unauthorized Neo4j delete attempt`)
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const params = DeleteSchema.parse(body) const params = DeleteSchema.parse(body)

View File

@@ -2,6 +2,7 @@ import { randomUUID } from 'crypto'
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { import {
convertNeo4jTypesToJSON, convertNeo4jTypesToJSON,
createNeo4jDriver, createNeo4jDriver,
@@ -26,6 +27,12 @@ export async function POST(request: NextRequest) {
let driver = null let driver = null
let session = null let session = null
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
logger.warn(`[${requestId}] Unauthorized Neo4j execute attempt`)
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const params = ExecuteSchema.parse(body) const params = ExecuteSchema.parse(body)

View File

@@ -2,6 +2,7 @@ import { randomUUID } from 'crypto'
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { createNeo4jDriver } from '@/app/api/tools/neo4j/utils' import { createNeo4jDriver } from '@/app/api/tools/neo4j/utils'
import type { Neo4jNodeSchema, Neo4jRelationshipSchema } from '@/tools/neo4j/types' import type { Neo4jNodeSchema, Neo4jRelationshipSchema } from '@/tools/neo4j/types'
@@ -21,6 +22,12 @@ export async function POST(request: NextRequest) {
let driver = null let driver = null
let session = null let session = null
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
logger.warn(`[${requestId}] Unauthorized Neo4j introspect attempt`)
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const params = IntrospectSchema.parse(body) const params = IntrospectSchema.parse(body)

View File

@@ -2,6 +2,7 @@ import { randomUUID } from 'crypto'
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { import {
convertNeo4jTypesToJSON, convertNeo4jTypesToJSON,
createNeo4jDriver, createNeo4jDriver,
@@ -26,6 +27,12 @@ export async function POST(request: NextRequest) {
let driver = null let driver = null
let session = null let session = null
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
logger.warn(`[${requestId}] Unauthorized Neo4j merge attempt`)
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const params = MergeSchema.parse(body) const params = MergeSchema.parse(body)

View File

@@ -2,6 +2,7 @@ import { randomUUID } from 'crypto'
import { createLogger } from '@sim/logger' import { createLogger } from '@sim/logger'
import { type NextRequest, NextResponse } from 'next/server' import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod' import { z } from 'zod'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { import {
convertNeo4jTypesToJSON, convertNeo4jTypesToJSON,
createNeo4jDriver, createNeo4jDriver,
@@ -26,6 +27,12 @@ export async function POST(request: NextRequest) {
let driver = null let driver = null
let session = null let session = null
const auth = await checkInternalAuth(request)
if (!auth.success || !auth.userId) {
logger.warn(`[${requestId}] Unauthorized Neo4j query attempt`)
return NextResponse.json({ error: auth.error || 'Unauthorized' }, { status: 401 })
}
try { try {
const body = await request.json() const body = await request.json()
const params = QuerySchema.parse(body) const params = QuerySchema.parse(body)

Some files were not shown because too many files have changed in this diff Show More