diff --git a/.gitignore b/.gitignore index 22f885e..db9421f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +*.mcpb +bun.lock +.env.local **/.speakeasy/logs/ **/.speakeasy/reports/ **/.speakeasy/temp/ diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index b66459f..81912ab 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,29 +1,29 @@ lockVersion: 2.0.0 id: 0dd544ca-3933-4c41-a5b5-b9a57ec94099 management: - docChecksum: c617421c76246bbd42a1dd36e4e3ba71 + docChecksum: 1b11791f4cce0a05cb8ad955ac4989f6 docVersion: 0.0.1 - speakeasyVersion: 1.606.3 - generationVersion: 2.687.1 - releaseVersion: 0.0.1-beta.14 - configChecksum: 04f9e0e798941663db361a6e2a79021b + speakeasyVersion: 1.666.0 + generationVersion: 2.768.0 + releaseVersion: 0.0.1-beta.15 + configChecksum: 5c7d68c7a35d90bb167b5a69c5730c37 repoURL: https://github.com/firehydrant/firehydrant-mcp.git published: true features: mcp-typescript: additionalDependencies: 0.1.0 constsAndDefaults: 0.1.0 - core: 0.3.4 + core: 0.8.4 defaultEnabledRetries: 0.1.0 enumUnions: 0.1.0 - globalSecurity: 0.1.0 + globalSecurity: 0.1.1 globalSecurityCallbacks: 0.0.0 - globalServerURLs: 0.1.0 + globalServerURLs: 0.1.1 nullables: 0.1.0 - responseFormat: 0.1.0 + responseFormat: 0.1.1 retries: 0.1.0 - sdkHooks: 0.1.0 - unions: 0.1.0 + sdkHooks: 0.3.0 + unions: 0.2.0 generatedFiles: - .dxtignore - .gitattributes @@ -139,7 +139,3 @@ generatedFiles: - tsconfig.json examplesVersion: 1.0.2 generatedTests: {} -releaseNotes: | - ## SDK Changes Detected: - * `FireHydrant.Retrospectives.list_incident_retrospectives()`: `response.data.[].fields.[]` **Changed** **Breaking** :warning: - * `FireHydrant.Retrospectives.update_incident_retrospective_field()`: `response` **Changed** **Breaking** :warning: diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index bd07f74..7519984 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -16,13 +16,17 @@ generation: auth: oAuth2ClientCredentialsEnabled: true oAuth2PasswordEnabled: true + hoistGlobalSecurity: true sdkHooksConfigAccess: true + schemas: + allOfMergeStrategy: shallowMerge + requestBodyFieldName: "" tests: generateTests: true generateNewTests: false skipResponseBodyAssertions: false mcp-typescript: - version: 0.0.1-beta.14 + version: 0.0.1-beta.15 additionalDependencies: dependencies: '@tiptap/core': ^3.0.7 @@ -34,6 +38,11 @@ mcp-typescript: baseErrorName: FireHydrantError cloudflareEnabled: false defaultErrorName: FireHydrantDefaultError + formStringArrayEncodeMode: encoded-string + inferUnionDiscriminators: false inputModelSuffix: input + maxMethodParams: 0 + multipartArrayFormat: legacy outputModelSuffix: output packageName: firehydrant-mcp + responseFormat: envelope diff --git a/.speakeasy/openapi.output.yaml b/.speakeasy/openapi.output.yaml index 5c81a81..b6328e2 100644 --- a/.speakeasy/openapi.output.yaml +++ b/.speakeasy/openapi.output.yaml @@ -10,6 +10,10 @@ security: tags: - name: "Call Routes" description: "Operations about Call Routes" + - name: "Permissions" + description: "Operations about Permissions" + - name: "Roles" + description: "Operations about Roles" - name: "Audit Events" description: "Operations about Audit Events" - name: "Pages" @@ -505,8 +509,13 @@ paths: "/v1/users/{id}": {} "/v1/users/{id}/services": {} "/v1/current_user": {} + "/v1/permissions": {} + "/v1/permissions/current_user": {} + "/v1/permissions/team": {} "/v1/reports/mean_time": {} "/v1/retrospectives": {} + "/v1/roles": {} + "/v1/roles/{id}": {} "/v1/metrics/ticket_funnel": {} "/v1/metrics/retrospectives": {} "/v1/metrics/milestone_funnel": {} @@ -578,7 +587,7 @@ paths: tags: - "Alerts" summary: "List alerts" - description: "Retrieve all alerts from third parties" + description: "Retrieve all alerts, including Signals alerts and third-party" operationId: "list_alerts" parameters: - name: "page" @@ -659,7 +668,7 @@ paths: nullable: true responses: "200": - description: "Retrieve all alerts from third parties" + description: "Retrieve all alerts, including Signals alerts and third-party" content: "application/json": schema: {"$ref": "#/components/schemas/Alerts_AlertEntityPaginated"} @@ -1104,6 +1113,7 @@ components: type: "string" "labels": type: "object" + additionalProperties: true description: "An object of label key and values" nullable: true "alert_on_add": @@ -1290,6 +1300,7 @@ components: type: "string" "labels": type: "object" + additionalProperties: true description: "An object of label key and values" nullable: true "alert_on_add": @@ -1332,6 +1343,7 @@ components: nullable: true "labels": type: "object" + additionalProperties: true description: "An object of label key and values" nullable: true "active_incidents": @@ -1418,6 +1430,7 @@ components: type: "string" "labels": type: "object" + additionalProperties: true description: "An object of label key and values" nullable: true "alert_on_add": @@ -3050,6 +3063,7 @@ components: nullable: true "labels": type: "object" + additionalProperties: true description: "An object of label key and values" nullable: true "active_incidents": @@ -5113,6 +5127,7 @@ components: - "HIGH" - "MEDIUM" - "LOW" + - "" "create_incident_condition_when": type: "string" nullable: true @@ -7031,8 +7046,19 @@ components: "description": type: "string" nullable: true + "allowed_role_ids": + type: "array" + description: "IDs of roles allowed to create incidents of this type. Empty array means all roles are allowed." + nullable: true + items: + type: "string" "template": {"$ref": "#/components/schemas/NullableIncidentTypeEntity_TemplateEntity"} "template_values": {"$ref": "#/components/schemas/NullableIncidentTypeEntity_TemplateValuesEntity"} + "required_fields": + type: "array" + description: "A list of fields that are required on incidents of this type." + nullable: true + items: {"$ref": "#/components/schemas/Incidents_RequiredFieldEntity"} "created_at": type: "string" format: "date-time" @@ -7059,6 +7085,7 @@ components: nullable: true "labels": type: "object" + additionalProperties: true description: "Arbitrary key:value pairs of labels for your incidents." nullable: true "severity": @@ -7137,7 +7164,18 @@ components: "teams": type: "array" nullable: true - items: {"$ref": "#/components/schemas/TeamEntity"} + items: {"$ref": "#/components/schemas/TeamEntityLite"} + "Incidents_RequiredFieldEntity": + type: "object" + properties: + "id": + type: "string" + description: "A unique identifier for the field. For built-in fields, this will be human-readable. For custom fields or milestone timestamps, it will be a prefixed version of the field or milestone's UUID." + nullable: true + "required_at_milestone_id": + type: "string" + description: "The milestone at which this field is required. If null, this field is always required." + nullable: true "IncidentTypeEntityPaginated": type: "object" properties: @@ -7849,6 +7887,43 @@ components: format: "int32" nullable: true description: "CurrentUserEntity model" + "PermissionEntityList": + type: "object" + properties: + "data": + type: "array" + nullable: true + items: {"$ref": "#/components/schemas/PublicAPI_V1_PermissionEntity"} + description: "PermissionEntityList model" + "PublicAPI_V1_PermissionEntity": + type: "object" + properties: + "slug": + type: "string" + nullable: true + "display_name": + type: "string" + nullable: true + "description": + type: "string" + nullable: true + "category_display_name": + type: "string" + nullable: true + "category_slug": + type: "string" + nullable: true + "parent_slug": + type: "string" + nullable: true + "available": + type: "boolean" + nullable: true + "dependency_slugs": + type: "array" + nullable: true + items: + type: "string" "ReportEntity": type: "object" properties: @@ -7888,6 +7963,209 @@ components: type: "integer" format: "int32" nullable: true + "create_role": + required: + - "name" + type: "object" + properties: + "name": + type: "string" + description: "The name of the role." + "slug": + type: "string" + description: "A unique identifier for the role. If not provided, one will be generated from the name." + nullable: true + "description": + type: "string" + description: "A long-form description of the role's purpose." + nullable: true + "permissions": + type: "array" + description: "An array of permission slugs to assign to the role." + nullable: true + items: + type: "string" + enum: + - "create_alerts" + - "respond_to_alerts" + - "read_alerts" + - "manage_alert_grouping" + - "read_alert_grouping" + - "manage_alert_rules" + - "read_alert_rules" + - "manage_call_routes" + - "read_call_routes" + - "manage_escalation_policies" + - "read_escalation_policies" + - "manage_event_sources" + - "read_event_sources" + - "manage_on_call_schedules" + - "read_on_call_schedules" + - "manage_on_call_shifts" + - "claim_on_call_shifts" + - "manage_organization_notification_policies" + - "read_notification_policy_compliance" + - "manage_webhook_targets" + - "read_webhook_targets" + - "read_analytics" + - "manage_api_keys" + - "read_api_keys" + - "manage_audiences" + - "read_audiences" + - "read_audit_events" + - "manage_change_events" + - "read_change_events" + - "manage_incidents" + - "create_incidents" + - "read_incidents" + - "manage_incident_settings" + - "read_incident_settings" + - "manage_integrations" + - "read_integrations" + - "manage_private_incidents" + - "manage_organization_secrets" + - "read_organization_secrets" + - "manage_organization_settings" + - "read_organization_settings" + - "manage_roles" + - "read_roles" + - "manage_runbooks" + - "read_runbooks" + - "manage_service_catalog" + - "read_service_catalog" + - "manage_status_templates" + - "read_status_templates" + - "manage_status_page_updates" + - "manage_support_hours" + - "read_support_hours" + - "manage_teams" + - "read_teams" + - "manage_users" + - "read_users" + - "manage_webhooks" + - "read_webhooks" + description: "Create a new role" + "PublicAPI_V1_RoleEntity": + type: "object" + properties: + "id": + type: "string" + nullable: true + "name": + type: "string" + nullable: true + "slug": + type: "string" + nullable: true + "description": + type: "string" + nullable: true + "created_at": + type: "string" + format: "date-time" + nullable: true + "updated_at": + type: "string" + format: "date-time" + nullable: true + "built_in": + type: "boolean" + nullable: true + "read_only": + type: "boolean" + nullable: true + "permissions": + type: "array" + nullable: true + items: {"$ref": "#/components/schemas/PublicAPI_V1_PermissionEntity"} + description: "PublicAPI_V1_RoleEntity model" + "RoleEntityPaginated": + type: "object" + properties: + "data": + type: "array" + nullable: true + items: {"$ref": "#/components/schemas/PublicAPI_V1_RoleEntity"} + "pagination": {"$ref": "#/components/schemas/NullablePaginationEntity"} + description: "RoleEntityPaginated model" + "update_role": + required: + - "name" + type: "object" + properties: + "name": + type: "string" + description: "The name of the role." + "description": + type: "string" + description: "A long-form description of the role's purpose." + nullable: true + "permissions": + type: "array" + description: "An array of permission slugs to assign to the role." + nullable: true + items: + type: "string" + enum: + - "create_alerts" + - "respond_to_alerts" + - "read_alerts" + - "manage_alert_grouping" + - "read_alert_grouping" + - "manage_alert_rules" + - "read_alert_rules" + - "manage_call_routes" + - "read_call_routes" + - "manage_escalation_policies" + - "read_escalation_policies" + - "manage_event_sources" + - "read_event_sources" + - "manage_on_call_schedules" + - "read_on_call_schedules" + - "manage_on_call_shifts" + - "claim_on_call_shifts" + - "manage_organization_notification_policies" + - "read_notification_policy_compliance" + - "manage_webhook_targets" + - "read_webhook_targets" + - "read_analytics" + - "manage_api_keys" + - "read_api_keys" + - "manage_audiences" + - "read_audiences" + - "read_audit_events" + - "manage_change_events" + - "read_change_events" + - "manage_incidents" + - "create_incidents" + - "read_incidents" + - "manage_incident_settings" + - "read_incident_settings" + - "manage_integrations" + - "read_integrations" + - "manage_private_incidents" + - "manage_organization_secrets" + - "read_organization_secrets" + - "manage_organization_settings" + - "read_organization_settings" + - "manage_roles" + - "read_roles" + - "manage_runbooks" + - "read_runbooks" + - "manage_service_catalog" + - "read_service_catalog" + - "manage_status_templates" + - "read_status_templates" + - "manage_status_page_updates" + - "manage_support_hours" + - "read_support_hours" + - "manage_teams" + - "read_teams" + - "manage_users" + - "read_users" + - "manage_webhooks" + - "read_webhooks" + description: "Update a role" "Metrics_TicketFunnelMetricsEntity": type: "object" properties: @@ -8738,7 +9016,7 @@ components: nullable: true items: {"$ref": "#/components/schemas/RunbookStepEntity"} "attachment_rule": {"$ref": "#/components/schemas/NullableRules_RuleEntity"} - "votes": {"$ref": "#/components/schemas/NullableVotesEntity"} + "votes": {"$ref": "#/components/schemas/NullableEmptyVotesEntity"} "is_editable": type: "boolean" nullable: true @@ -8806,8 +9084,31 @@ components: "repeats_duration": type: "string" nullable: true - "votes": {"$ref": "#/components/schemas/NullableVotesEntity"} + "votes": {"$ref": "#/components/schemas/NullableEmptyVotesEntity"} "rule": {"$ref": "#/components/schemas/NullableRules_RuleEntity"} + "EmptyVotesEntity": + type: "object" + properties: + "voted": + type: "boolean" + description: "Whether or not the current actor has voted" + nullable: true + "liked": + type: "boolean" + description: "Whether or not the current actor has voted positively" + nullable: true + "disliked": + type: "boolean" + description: "Whether or not the current actor has voted negatively" + nullable: true + "likes": + type: "integer" + format: "int32" + nullable: true + "dislikes": + type: "integer" + format: "int32" + nullable: true "update_runbook": type: "object" properties: @@ -9122,6 +9423,7 @@ components: nullable: true "filter_values": type: "object" + additionalProperties: true description: "An unstructured key/value pair of saved values for searching" nullable: true description: "SavedSearchEntity model" @@ -9171,7 +9473,6 @@ components: type: "array" nullable: true items: {"$ref": "#/components/schemas/Lifecycles_MilestoneEntity"} - description: "Lifecycles_PhaseEntity model" "Lifecycles_MilestoneEntity": type: "object" properties: @@ -9204,6 +9505,7 @@ components: type: "string" format: "date-time" nullable: true + description: "Lifecycles_MilestoneEntity model" "create_priority": required: - "slug" @@ -9281,6 +9583,12 @@ components: - "teal" - "grey" - "green" + "allowed_role_ids": + type: "array" + description: "IDs of roles allowed to use this severity. Empty array means all roles are allowed." + nullable: true + items: + type: "string" description: "Create a new severity" "SeverityEntity": type: "object" @@ -9312,6 +9620,12 @@ components: "color": type: "string" nullable: true + "allowed_role_ids": + type: "array" + description: "IDs of roles allowed to use this severity. Empty array means all roles are allowed." + nullable: true + items: + type: "string" description: "SeverityEntity model" "SeverityEntityPaginated": type: "object" @@ -9346,6 +9660,12 @@ components: - "teal" - "grey" - "green" + "allowed_role_ids": + type: "array" + description: "IDs of roles allowed to use this severity. Empty array means all roles are allowed." + nullable: true + items: + type: "string" description: "Update a specific severity" "update_severity_matrix": required: @@ -9780,6 +10100,7 @@ components: nullable: true "required": type: "boolean" + description: "Whether this field is required for all incidents." nullable: true "required_at_milestone_id": type: "string" @@ -9795,7 +10116,6 @@ components: required: - "display_name" - "field_type" - - "required" type: "object" properties: "display_name": @@ -9812,6 +10132,8 @@ components: type: "string" "required": type: "boolean" + description: "Whether this field should be required for all incidents." + nullable: true "required_at_milestone_id": type: "string" description: "An optional milestone ID to specify when the field should become required, if `required` is set to `true`. If not provided, required fields are always required." @@ -10284,6 +10606,29 @@ components: enum: - "i18n_key" - "custom" + "create_signals_page": + required: + - "summary" + - "target_id" + - "target_type" + type: "object" + properties: + "summary": + type: "string" + "target_type": + type: "string" + enum: + - "EscalationPolicy" + - "OnCallSchedule" + - "Team" + - "User" + "target_id": + type: "string" + description: "The ID of the target. Should be a UUID for the target type." + "body": + type: "string" + nullable: true + description: "Used for paging an on-call target within FireHydrant's signals product. This can be used for paging users, teams, on-call schedules, and escalation policies." "create_ticket": required: - "summary" @@ -10638,6 +10983,31 @@ components: description: "A long-form description for the task if additional context is helpful" nullable: true description: "Updates a task list's attributes and task list items" + "patch_scim_group": + required: + - "Operations" + type: "object" + properties: + "trail": + type: "string" + description: "An optional trail to log the request" + nullable: true + "Operations": + type: "array" + description: "An array of operations to perform on the group" + items: + required: + - "op" + type: "object" + properties: + "op": + type: "string" + description: "The operation to perform. Options are add, remove, replace" + "path": + type: "string" + description: "The path to the attribute to be modified" + nullable: true + description: "SCIM endpoint to partially update a Team (Colloquial for Group in the SCIM protocol). Supports adding, removing, or replacing members using SCIM PATCH operations." "update_scim_group": required: - "displayName" @@ -10693,7 +11063,6 @@ components: items: required: - "op" - - "path" type: "object" properties: "op": @@ -10701,7 +11070,8 @@ components: description: "The operation to perform on the user. Options are add, remove, replace" "path": type: "string" - description: "The path to the attribute to be modified" + description: "The path to the attribute to be modified. Optional for Okta OIN format where value contains the full update object" + nullable: true description: "PATCH SCIM endpoint to update a User. This endpoint is used to update a resource's attributes." "update_scim_user": type: "object" @@ -10779,6 +11149,10 @@ components: "userName": type: "string" description: "A service provider's unique identifier for the user" + "externalId": + type: "string" + description: "A unique identifier for the user from the external provisioning system" + nullable: true "name": required: - "familyName" @@ -11341,7 +11715,7 @@ components: "substring": required: - "field_name" - - "value" + - "values" type: "object" properties: "field_name": @@ -11351,9 +11725,18 @@ components: - "summary" - "body" - "tags" - "value": + "values": + type: "array" + description: "Multiple values to use for grouping alerts" + items: + type: "string" + "match_type": type: "string" - description: "The value to use for grouping alerts" + description: "Match type for multiple values" + nullable: true + enum: + - "and" + - "or" description: "The type of strategy to use for grouping alerts" nullable: true description: "The strategy to use for grouping alerts" @@ -11407,6 +11790,14 @@ components: "value": type: "string" nullable: true + "values": + type: "array" + nullable: true + items: + type: "string" + "match_type": + type: "string" + nullable: true "Signals_API_GroupingEntity_ActionEntity": type: "object" properties: @@ -11439,7 +11830,7 @@ components: "substring": required: - "field_name" - - "value" + - "values" type: "object" properties: "field_name": @@ -11449,9 +11840,18 @@ components: - "summary" - "body" - "tags" - "value": + "values": + type: "array" + description: "Multiple values to use for grouping alerts" + items: + type: "string" + "match_type": type: "string" - description: "The value to use for grouping alerts" + description: "Match type for multiple values" + nullable: true + enum: + - "and" + - "or" description: "The type of strategy to use for grouping alerts" nullable: true description: "The strategy to use for grouping alerts" @@ -12097,6 +12497,163 @@ components: type: "string" description: "Slug of the detail, unique and autogenerated" nullable: true + "create_audience": + required: + - "description" + - "name" + type: "object" + properties: + "name": + type: "string" + description: "Name of the audience (max 255 characters)" + "description": + type: "string" + description: "Description of the audience (max 4000 characters)" + "default": + type: "boolean" + description: "Whether this is the default audience" + nullable: true + default: false + "details": + type: "array" + nullable: true + items: + required: + - "prompt" + - "question" + type: "object" + properties: + "question": + type: "string" + description: "The incident detail question (max 255 characters)" + "prompt": + type: "string" + description: "The prompt to display when collecting this detail" + "slug": + type: "string" + description: "Optional unique identifier for this detail" + nullable: true + "settings": + required: + - "alerts" + - "communications" + - "current_milestone" + - "custom_fields" + - "customer_impact_summary" + - "description" + - "high_value_events" + - "id" + - "medium_value_events" + - "name" + - "responders" + - "services" + - "severity" + - "started_at" + - "status" + - "timeline" + - "work_items" + type: "object" + properties: + "id": + type: "boolean" + description: "Include the incident's id in summarization" + "name": + type: "boolean" + description: "Include the incident's name in summarization" + "started_at": + type: "boolean" + description: "Include the datetime the incident started in summarization" + "status": + type: "boolean" + description: "Include the incident's status in summarization" + "severity": + type: "boolean" + description: "Include the incident's severity in summarization" + "description": + type: "boolean" + description: "Include the incident's description in summarization" + "customer_impact_summary": + type: "boolean" + description: "Include the incident's customer impact summary in summarization" + "current_milestone": + type: "boolean" + description: "Include the incident's current milestone in summarization" + "timeline": + type: "boolean" + description: "Include each milestone change and any high or medium value event in summarization" + "communications": + type: "boolean" + description: "Include all communication (starred or not) in summarization" + "work_items": + type: "boolean" + description: "Include all tickets and tasks in summarization" + "services": + type: "boolean" + description: "Include all impacted catalog items in summarization" + "custom_fields": + type: "boolean" + description: "Include all custom fields for the incident in summarization" + "alerts": + type: "boolean" + description: "Include all alerts related to the incident in summarization" + "responders": + type: "boolean" + description: "Include all information on responders, their roles, and any assigned teams" + "high_value_events": + required: + - "add_task_list" + - "bulk_milestone_update" + - "external_link" + - "handoff" + - "impact_update" + - "incident_status" + type: "object" + properties: + "incident_status": + type: "boolean" + description: "Include incident status change events in the timeline" + "bulk_milestone_update": + type: "boolean" + description: "Include bulk updates (including runbook or automation events) in the timeline" + "impact_update": + type: "boolean" + description: "Include any catalog item impact events in the timeline" + "handoff": + type: "boolean" + description: "Include any handoff events in the timeline" + "add_task_list": + type: "boolean" + description: "Include any additions to the task list in the timeline" + "external_link": + type: "boolean" + description: "Include any external link events in the timeline" + "medium_value_events": + required: + - "change_type" + - "child_changed" + - "new_related_change_event" + - "parent_changed" + - "runbook_step_execution_update" + type: "object" + properties: + "parent_changed": + type: "boolean" + description: "Include any events where the incident's parent changes in the timeline" + "child_changed": + type: "boolean" + description: "Include any events where the incident's children change in the timeline" + "new_related_change_event": + type: "boolean" + description: "Include any related change events in the timeline" + "runbook_step_execution_update": + type: "boolean" + description: "Include any runbook step updates in the timeline" + "change_type": + type: "boolean" + description: "Include any incident type change events in the timeline" + description: "audience settings for initial audience creation" + nullable: true + description: "Create a new audience" "Audiences_Entities_AudienceSummariesEntity": type: "object" properties: @@ -12896,6 +13453,10 @@ components: nullable: true allOf: - {"$ref": "#/components/schemas/IncidentTypeEntity_TemplateValuesEntity"} + "NullableIncidents_RequiredFieldEntity": + nullable: true + allOf: + - {"$ref": "#/components/schemas/Incidents_RequiredFieldEntity"} "NullableIncidentTypeEntityPaginated": nullable: true allOf: @@ -13028,6 +13589,14 @@ components: nullable: true allOf: - {"$ref": "#/components/schemas/CurrentUserEntity"} + "NullablePermissionEntityList": + nullable: true + allOf: + - {"$ref": "#/components/schemas/PermissionEntityList"} + "NullablePublicAPI_V1_PermissionEntity": + nullable: true + allOf: + - {"$ref": "#/components/schemas/PublicAPI_V1_PermissionEntity"} "NullableReportEntity": nullable: true allOf: @@ -13040,6 +13609,22 @@ components: nullable: true allOf: - {"$ref": "#/components/schemas/Reports_DataPointEntity"} + "Nullablecreate_role": + nullable: true + allOf: + - {"$ref": "#/components/schemas/create_role"} + "NullablePublicAPI_V1_RoleEntity": + nullable: true + allOf: + - {"$ref": "#/components/schemas/PublicAPI_V1_RoleEntity"} + "NullableRoleEntityPaginated": + nullable: true + allOf: + - {"$ref": "#/components/schemas/RoleEntityPaginated"} + "Nullableupdate_role": + nullable: true + allOf: + - {"$ref": "#/components/schemas/update_role"} "NullableMetrics_TicketFunnelMetricsEntity": nullable: true allOf: @@ -13204,6 +13789,10 @@ components: nullable: true allOf: - {"$ref": "#/components/schemas/RunbookStepEntity"} + "NullableEmptyVotesEntity": + nullable: true + allOf: + - {"$ref": "#/components/schemas/EmptyVotesEntity"} "Nullableupdate_runbook": nullable: true allOf: @@ -13480,6 +14069,10 @@ components: nullable: true allOf: - {"$ref": "#/components/schemas/Alerts_ProcessingLogEntryEntity"} + "Nullablecreate_signals_page": + nullable: true + allOf: + - {"$ref": "#/components/schemas/create_signals_page"} "Nullablecreate_ticket": nullable: true allOf: @@ -13552,6 +14145,10 @@ components: nullable: true allOf: - {"$ref": "#/components/schemas/update_task_list"} + "Nullablepatch_scim_group": + nullable: true + allOf: + - {"$ref": "#/components/schemas/patch_scim_group"} "Nullableupdate_scim_group": nullable: true allOf: @@ -13796,6 +14393,10 @@ components: nullable: true allOf: - {"$ref": "#/components/schemas/Audiences_Entities_DetailEntity"} + "Nullablecreate_audience": + nullable: true + allOf: + - {"$ref": "#/components/schemas/create_audience"} "NullableAudiences_Entities_AudienceSummariesEntity": nullable: true allOf: diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index e5336ef..e55ab3e 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -1,19 +1,19 @@ -speakeasyVersion: 1.606.3 +speakeasyVersion: 1.666.0 sources: FireHydrant-OAS: sourceNamespace: fire-hydrant-mcp-oas - sourceRevisionDigest: sha256:7b815c4f3643a63af14ccc468e3bc759ba6f086e074da4c1e4902d9a91f954a4 - sourceBlobDigest: sha256:05ad2cdbc373e1a5ac9d6e021e75e8dbbf8a9cea3890c1406a7aaf3e253fb253 + sourceRevisionDigest: sha256:7664a6a9179984a6fafa08163b51f9a86236cf6b6cd376a4efc6b9b24a0a91da + sourceBlobDigest: sha256:dab94a33de1c15ebce4467d63d88eb68839f56bfcbb72035bc8d386c0f91b134 tags: - latest - - speakeasy-sdk-regen-1755216278 + - speakeasy-sdk-regen-1762560281 - 0.0.1 targets: fire-hydrant: source: FireHydrant-OAS sourceNamespace: fire-hydrant-mcp-oas - sourceRevisionDigest: sha256:7b815c4f3643a63af14ccc468e3bc759ba6f086e074da4c1e4902d9a91f954a4 - sourceBlobDigest: sha256:05ad2cdbc373e1a5ac9d6e021e75e8dbbf8a9cea3890c1406a7aaf3e253fb253 + sourceRevisionDigest: sha256:7664a6a9179984a6fafa08163b51f9a86236cf6b6cd376a4efc6b9b24a0a91da + sourceBlobDigest: sha256:dab94a33de1c15ebce4467d63d88eb68839f56bfcbb72035bc8d386c0f91b134 workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/README.md b/README.md index edbf09d..b32270b 100644 --- a/README.md +++ b/README.md @@ -29,16 +29,16 @@ FireHydrant MCP Server: An MCP server for interacting with FireHydrant's API. ## Installation
-DXT (Desktop Extension) +MCP Bundle (Desktop Extension) -Install the MCP server as a Desktop Extension using the pre-built [`mcp-server.dxt`](./mcp-server.dxt) file: +Install the MCP server as a Desktop Extension using the pre-built [`mcp-server.mcpb`](./mcp-server.mcpb) file: -Simply drag and drop the [`mcp-server.dxt`](./mcp-server.dxt) file onto Claude Desktop to install the extension. +Simply drag and drop the [`mcp-server.mcpb`](./mcp-server.mcpb) file onto Claude Desktop to install the extension. -The DXT package includes the MCP server and all necessary configuration. Once installed, the server will be available without additional setup. +The MCP bundle package includes the MCP server and all necessary configuration. Once installed, the server will be available without additional setup. > [!NOTE] -> DXT (Desktop Extensions) provide a streamlined way to package and distribute MCP servers. Learn more about [Desktop Extensions](https://www.anthropic.com/engineering/desktop-extensions). +> MCP bundles provide a streamlined way to package and distribute MCP servers. Learn more about [Desktop Extensions](https://www.anthropic.com/engineering/desktop-extensions).
diff --git a/RELEASES.md b/RELEASES.md index ea6c617..b83f77b 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -54,4 +54,12 @@ Based on: - OpenAPI Doc - Speakeasy CLI 1.606.3 (2.687.1) https://github.com/speakeasy-api/speakeasy ### Generated -- [mcp-typescript v0.0.1-beta.14] . \ No newline at end of file +- [mcp-typescript v0.0.1-beta.14] . + +## 2025-12-02 00:04:34 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.666.0 (2.768.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [mcp-typescript v0.0.1-beta.15] . \ No newline at end of file diff --git a/bun.lock b/bun.lock index a17f195..9d7e19c 100644 --- a/bun.lock +++ b/bun.lock @@ -14,7 +14,7 @@ "zod": "^3.25.7", }, "devDependencies": { - "@anthropic-ai/dxt": "^0.1.0", + "@anthropic-ai/mcpb": "^1.2.0", "@eslint/js": "^9.26.0", "@types/bun": "^1.2.13", "@types/express": "^5.0.1", @@ -27,7 +27,7 @@ }, }, "packages": { - "@anthropic-ai/dxt": ["@anthropic-ai/dxt@0.1.0", "", { "dependencies": { "@inquirer/prompts": "^6.0.1", "commander": "^13.1.0", "fflate": "^0.8.2", "node-forge": "^1.3.1", "zod": "^3.24.4" }, "bin": { "dxt": "dist/cli/cli.js" } }, "sha512-/CHobspHxBIOuuzv5gW/xWN6RHnT5SXpR5QB5stWcnqXoRwl+YQ+CVh/RPDYSVwr0vLFy4N2jtVov9iXg8aj0g=="], + "@anthropic-ai/mcpb": ["@anthropic-ai/mcpb@1.2.0", "", { "dependencies": { "@inquirer/prompts": "^6.0.1", "commander": "^13.1.0", "fflate": "^0.8.2", "galactus": "^1.0.0", "ignore": "^7.0.5", "node-forge": "^1.3.1", "pretty-bytes": "^5.6.0", "zod": "^3.25.67", "zod-to-json-schema": "^3.24.6" }, "bin": { "mcpb": "dist/cli/cli.js" } }, "sha512-XYVCxQJsr4D4ZecEXVe9PvBpKj2T31KgEiT8K4thoi7krPFIQjXj4yOolAXP8hGSJHrW1Nf4odZES1kjLNDVkg=="], "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], @@ -371,12 +371,18 @@ "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + "flora-colossus": ["flora-colossus@2.0.0", "", { "dependencies": { "debug": "^4.3.4", "fs-extra": "^10.1.0" } }, "sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA=="], + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + "fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + "galactus": ["galactus@1.0.0", "", { "dependencies": { "debug": "^4.3.4", "flora-colossus": "^2.0.0", "fs-extra": "^10.1.0" } }, "sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ=="], + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], @@ -387,6 +393,8 @@ "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], "happy-dom": ["happy-dom@18.0.1", "", { "dependencies": { "@types/node": "^20.0.0", "@types/whatwg-mimetype": "^3.0.2", "whatwg-mimetype": "^3.0.0" } }, "sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA=="], @@ -401,7 +409,7 @@ "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], - "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], @@ -431,6 +439,8 @@ "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], @@ -507,6 +517,8 @@ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + "pretty-bytes": ["pretty-bytes@5.6.0", "", {}, "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg=="], + "prosemirror-changeset": ["prosemirror-changeset@2.3.1", "", { "dependencies": { "prosemirror-transform": "^1.0.0" } }, "sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ=="], "prosemirror-collab": ["prosemirror-collab@1.3.1", "", { "dependencies": { "prosemirror-state": "^1.0.0" } }, "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ=="], @@ -625,6 +637,8 @@ "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], @@ -649,20 +663,26 @@ "zod": ["zod@3.25.63", "", {}, "sha512-3ttCkqhtpncYXfP0f6dsyabbYV/nEUW+Xlu89jiXbTBifUfjaSqXOG6JnQPLtqt87n7KAmnMqcjay6c0Wq0Vbw=="], - "zod-to-json-schema": ["zod-to-json-schema@3.24.5", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g=="], + "zod-to-json-schema": ["zod-to-json-schema@3.25.0", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ=="], + + "@anthropic-ai/mcpb/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.15.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw=="], "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + "@modelcontextprotocol/sdk/zod-to-json-schema": ["zod-to-json-schema@3.24.5", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g=="], "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "external-editor/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], diff --git a/manifest.json b/manifest.json index 9e950d0..f5ba150 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { - "dxt_version": "0.1", + "manifest_version": "0.3", "name": "firehydrant-mcp", - "version": "0.0.1-beta.14", + "version": "0.0.1-beta.15", "description": "", "long_description": "FireHydrant MCP Server: An MCP server for interacting with FireHydrant's API.", "author": { @@ -40,7 +40,7 @@ }, { "name": "list-alerts", - "description": "List alerts\n\nRetrieve all alerts from third parties" + "description": "List alerts\n\nRetrieve all alerts, including Signals alerts and third-party" } ], "prompts": [], diff --git a/package-lock.json b/package-lock.json index abf5508..5cef43d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "firehydrant-mcp", - "version": "0.0.1-beta.14", + "version": "0.0.1-beta.15", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "firehydrant-mcp", - "version": "0.0.1-beta.14", + "version": "0.0.1-beta.15", "dependencies": { "@modelcontextprotocol/sdk": "^1.17.0", "@stricli/core": "^1.1.2", @@ -22,7 +22,7 @@ "mcp": "bin/mcp-server.js" }, "devDependencies": { - "@anthropic-ai/dxt": "^0.1.0", + "@anthropic-ai/mcpb": "^1.2.0", "@eslint/js": "^9.26.0", "@types/bun": "^1.2.13", "@types/express": "^5.0.1", @@ -33,21 +33,35 @@ "typescript-eslint": "^8.31.1" } }, - "node_modules/@anthropic-ai/dxt": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/dxt/-/dxt-0.1.0.tgz", - "integrity": "sha512-/CHobspHxBIOuuzv5gW/xWN6RHnT5SXpR5QB5stWcnqXoRwl+YQ+CVh/RPDYSVwr0vLFy4N2jtVov9iXg8aj0g==", + "node_modules/@anthropic-ai/mcpb": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@anthropic-ai/mcpb/-/mcpb-1.2.0.tgz", + "integrity": "sha512-XYVCxQJsr4D4ZecEXVe9PvBpKj2T31KgEiT8K4thoi7krPFIQjXj4yOolAXP8hGSJHrW1Nf4odZES1kjLNDVkg==", "dev": true, "license": "MIT", "dependencies": { "@inquirer/prompts": "^6.0.1", "commander": "^13.1.0", "fflate": "^0.8.2", + "galactus": "^1.0.0", + "ignore": "^7.0.5", "node-forge": "^1.3.1", - "zod": "^3.24.4" + "pretty-bytes": "^5.6.0", + "zod": "^3.25.67", + "zod-to-json-schema": "^3.24.6" }, "bin": { - "dxt": "dist/cli/cli.js" + "mcpb": "dist/cli/cli.js" + } + }, + "node_modules/@anthropic-ai/mcpb/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, "node_modules/@eslint-community/eslint-utils": { @@ -2474,6 +2488,20 @@ "dev": true, "license": "ISC" }, + "node_modules/flora-colossus": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-2.0.0.tgz", + "integrity": "sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -2492,6 +2520,21 @@ "node": ">= 0.8" } }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -2501,6 +2544,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/galactus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/galactus/-/galactus-1.0.0.tgz", + "integrity": "sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "flora-colossus": "^2.0.0", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -2576,6 +2634,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -2819,6 +2884,19 @@ "dev": true, "license": "MIT" }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -3224,6 +3302,19 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/prosemirror-changeset": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.3.1.tgz", @@ -3965,6 +4056,16 @@ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -4081,21 +4182,21 @@ } }, "node_modules/zod": { - "version": "3.25.63", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.63.tgz", - "integrity": "sha512-3ttCkqhtpncYXfP0f6dsyabbYV/nEUW+Xlu89jiXbTBifUfjaSqXOG6JnQPLtqt87n7KAmnMqcjay6c0Wq0Vbw==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-to-json-schema": { - "version": "3.24.5", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", - "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", + "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", "license": "ISC", "peerDependencies": { - "zod": "^3.24.1" + "zod": "^3.25 || ^4" } } } diff --git a/package.json b/package.json index f3486d9..1654fd6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "firehydrant-mcp", - "version": "0.0.1-beta.14", + "version": "0.0.1-beta.15", "author": "FireHydrant", "type": "module", "sideEffects": false, @@ -29,7 +29,7 @@ "zod": "^3.25.7" }, "devDependencies": { - "@anthropic-ai/dxt": "^0.1.0", + "@anthropic-ai/mcpb": "^1.2.0", "@eslint/js": "^9.26.0", "@types/bun": "^1.2.13", "@types/express": "^5.0.1", diff --git a/src/funcs/alertsListAlerts.ts b/src/funcs/alertsListAlerts.ts index 91ca2e2..3306143 100644 --- a/src/funcs/alertsListAlerts.ts +++ b/src/funcs/alertsListAlerts.ts @@ -32,7 +32,7 @@ import { Result } from "../types/fp.js"; * List alerts * * @remarks - * Retrieve all alerts from third parties + * Retrieve all alerts, including Signals alerts and third-party */ export function alertsListAlerts( client$: FireHydrantCore, @@ -109,9 +109,10 @@ async function $do( const requestSecurity = resolveGlobalSecurity(securityInput); const context = { + options: client$._options, baseURL: options?.serverURL ?? client$._baseURL ?? "", operationID: "list_alerts", - oAuth2Scopes: [], + oAuth2Scopes: null, resolvedSecurity: requestSecurity, securitySource: client$._options.security, retryConfig: options?.retries @@ -134,6 +135,7 @@ async function $do( headers: headers$, query: query$, body: body$, + userAgent: client$._options.userAgent, timeoutMs: options?.timeoutMs || client$._options.timeoutMs || -1, }, options); diff --git a/src/funcs/incidentsCreateIncident.ts b/src/funcs/incidentsCreateIncident.ts index 8749a69..28aaebe 100644 --- a/src/funcs/incidentsCreateIncident.ts +++ b/src/funcs/incidentsCreateIncident.ts @@ -98,9 +98,10 @@ async function $do( const requestSecurity = resolveGlobalSecurity(securityInput); const context = { + options: client$._options, baseURL: options?.serverURL ?? client$._baseURL ?? "", operationID: "create_incident", - oAuth2Scopes: [], + oAuth2Scopes: null, resolvedSecurity: requestSecurity, securitySource: client$._options.security, retryConfig: options?.retries @@ -122,6 +123,7 @@ async function $do( path: path$, headers: headers$, body: body$, + userAgent: client$._options.userAgent, timeoutMs: options?.timeoutMs || client$._options.timeoutMs || -1, }, options); diff --git a/src/funcs/incidentsListIncidents.ts b/src/funcs/incidentsListIncidents.ts index e521ce0..38ed289 100644 --- a/src/funcs/incidentsListIncidents.ts +++ b/src/funcs/incidentsListIncidents.ts @@ -130,9 +130,10 @@ async function $do( const requestSecurity = resolveGlobalSecurity(securityInput); const context = { + options: client$._options, baseURL: options?.serverURL ?? client$._baseURL ?? "", operationID: "list_incidents", - oAuth2Scopes: [], + oAuth2Scopes: null, resolvedSecurity: requestSecurity, securitySource: client$._options.security, retryConfig: options?.retries @@ -155,6 +156,7 @@ async function $do( headers: headers$, query: query$, body: body$, + userAgent: client$._options.userAgent, timeoutMs: options?.timeoutMs || client$._options.timeoutMs || -1, }, options); diff --git a/src/funcs/retrospectivesListIncidentRetrospectives.ts b/src/funcs/retrospectivesListIncidentRetrospectives.ts index 466a0d1..27eb40b 100644 --- a/src/funcs/retrospectivesListIncidentRetrospectives.ts +++ b/src/funcs/retrospectivesListIncidentRetrospectives.ts @@ -109,9 +109,10 @@ async function $do( const requestSecurity = resolveGlobalSecurity(securityInput); const context = { + options: client$._options, baseURL: options?.serverURL ?? client$._baseURL ?? "", operationID: "list_incident_retrospectives", - oAuth2Scopes: [], + oAuth2Scopes: null, resolvedSecurity: requestSecurity, securitySource: client$._options.security, retryConfig: options?.retries @@ -134,6 +135,7 @@ async function $do( headers: headers$, query: query$, body: body$, + userAgent: client$._options.userAgent, timeoutMs: options?.timeoutMs || client$._options.timeoutMs || -1, }, options); diff --git a/src/funcs/retrospectivesUpdateIncidentRetrospectiveField.ts b/src/funcs/retrospectivesUpdateIncidentRetrospectiveField.ts index 2a75d76..dbe5154 100644 --- a/src/funcs/retrospectivesUpdateIncidentRetrospectiveField.ts +++ b/src/funcs/retrospectivesUpdateIncidentRetrospectiveField.ts @@ -120,9 +120,10 @@ async function $do( const requestSecurity = resolveGlobalSecurity(securityInput); const context = { + options: client$._options, baseURL: options?.serverURL ?? client$._baseURL ?? "", operationID: "update_incident_retrospective_field", - oAuth2Scopes: [], + oAuth2Scopes: null, resolvedSecurity: requestSecurity, securitySource: client$._options.security, retryConfig: options?.retries @@ -144,6 +145,7 @@ async function $do( path: path$, headers: headers$, body: body$, + userAgent: client$._options.userAgent, timeoutMs: options?.timeoutMs || client$._options.timeoutMs || -1, }, options); diff --git a/src/hooks/hooks.ts b/src/hooks/hooks.ts index 65a8f0f..7709c66 100644 --- a/src/hooks/hooks.ts +++ b/src/hooks/hooks.ts @@ -15,9 +15,9 @@ import { Hook, Hooks, SDKInitHook, - SDKInitOptions, } from "./types.js"; +import { SDKOptions } from "../lib/config.js"; import { RequestInput } from "../lib/http.js"; export class SDKHooks implements Hooks { @@ -70,7 +70,7 @@ export class SDKHooks implements Hooks { this.afterErrorHooks.push(hook); } - sdkInit(opts: SDKInitOptions): SDKInitOptions { + sdkInit(opts: SDKOptions): SDKOptions { return this.sdkInitHooks.reduce((opts, hook) => hook.sdkInit(opts), opts); } diff --git a/src/hooks/types.ts b/src/hooks/types.ts index 1d56c6f..9c36bf0 100644 --- a/src/hooks/types.ts +++ b/src/hooks/types.ts @@ -2,7 +2,8 @@ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. */ -import { HTTPClient, RequestInput } from "../lib/http.js"; +import { SDKOptions } from "../lib/config.js"; +import { RequestInput } from "../lib/http.js"; import { RetryConfig } from "../lib/retries.js"; import { SecurityState } from "../lib/security.js"; @@ -13,15 +14,11 @@ export type HookContext = { securitySource?: any | (() => Promise); retryConfig: RetryConfig; resolvedSecurity: SecurityState | null; + options: SDKOptions; }; export type Awaitable = T | Promise; -export type SDKInitOptions = { - baseURL: URL | null; - client: HTTPClient; -}; - export type BeforeCreateRequestContext = HookContext & {}; export type BeforeRequestContext = HookContext & {}; export type AfterSuccessContext = HookContext & {}; @@ -32,7 +29,7 @@ export type AfterErrorContext = HookContext & {}; * hook can return a new baseURL and HTTP client to be used by the SDK. */ export interface SDKInitHook { - sdkInit: (opts: SDKInitOptions) => SDKInitOptions; + sdkInit: (opts: SDKOptions) => SDKOptions; } export interface BeforeCreateRequestHook { diff --git a/src/lib/config.ts b/src/lib/config.ts index fe61d41..69a406a 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -30,6 +30,10 @@ export type SDKOptions = { * Allows overriding the default server URL used by the SDK */ serverURL?: string | undefined; + /** + * Allows overriding the default user agent used by the SDK + */ + userAgent?: string | undefined; /** * Allows overriding the default retry config used by the SDK */ @@ -58,8 +62,8 @@ export function serverURLFromOptions(options: SDKOptions): URL | null { export const SDK_METADATA = { language: "typescript", openapiDocVersion: "0.0.1", - sdkVersion: "0.0.1-beta.14", - genVersion: "2.687.1", + sdkVersion: "0.0.1-beta.15", + genVersion: "2.768.0", userAgent: - "speakeasy-sdk/mcp-typescript 0.0.1-beta.14 2.687.1 0.0.1 firehydrant-mcp", + "speakeasy-sdk/mcp-typescript 0.0.1-beta.15 2.768.0 0.0.1 firehydrant-mcp", } as const; diff --git a/src/lib/encodings.ts b/src/lib/encodings.ts index 25c9dcb..c04aff5 100644 --- a/src/lib/encodings.ts +++ b/src/lib/encodings.ts @@ -102,8 +102,9 @@ export function encodeLabel( }); encValue = mapped?.join("").slice(1); } else { - const k = - options?.explode && isPlainObject(value) ? `${encodeString(pk)}=` : ""; + const k = options?.explode && isPlainObject(value) + ? `${encodeString(pk)}=` + : ""; encValue = `${k}${encodeValue(pv)}`; } @@ -440,7 +441,7 @@ type BulkQueryEncoder = ( ) => string; export function queryEncoder(f: QueryEncoder): BulkQueryEncoder { - const bulkEncode = function ( + const bulkEncode = function( values: Record, options?: QueryEncoderOptions, ): string { diff --git a/src/lib/matchers.ts b/src/lib/matchers.ts index 7c9a7c1..8ab970f 100644 --- a/src/lib/matchers.ts +++ b/src/lib/matchers.ts @@ -299,9 +299,11 @@ export function match( ); return [result.ok ? { ok: false, error: result.value } : result, raw]; } else { + const valueToParse = data; + return [ safeParse( - data, + valueToParse, (v: unknown) => matcher.schema.parse(v), "Response validation failed", ), diff --git a/src/lib/sdks.ts b/src/lib/sdks.ts index 1f254b8..cab0cbb 100644 --- a/src/lib/sdks.ts +++ b/src/lib/sdks.ts @@ -64,6 +64,7 @@ type RequestConfig = { headers?: HeadersInit; security?: SecurityState | null; uaHeader?: string; + userAgent?: string | undefined; timeoutMs?: number; }; @@ -95,19 +96,20 @@ export class ClientSDK { } else { this.#hooks = new SDKHooks(); } - this._options = { ...options, hooks: this.#hooks }; + const defaultHttpClient = new HTTPClient(); + options.httpClient = options.httpClient || defaultHttpClient; + options = this.#hooks.sdkInit(options); const url = serverURLFromOptions(options); if (url) { url.pathname = url.pathname.replace(/\/+$/, "") + "/"; } - const { baseURL, client } = this.#hooks.sdkInit({ - baseURL: url, - client: options.httpClient || new HTTPClient(), - }); - this._baseURL = baseURL; - this.#httpClient = client; - this.#logger = options.debugLogger; + this._baseURL = url; + this.#httpClient = options.httpClient || defaultHttpClient; + + this._options = { ...options, hooks: this.#hooks }; + + this.#logger = this._options.debugLogger; } public _createRequest( @@ -180,7 +182,10 @@ export class ClientSDK { // Only set user agent header in non-browser-like environments since CORS // policy disallows setting it in browsers e.g. Chrome throws an error. if (!isBrowserLike) { - headers.set(conf.uaHeader ?? "user-agent", SDK_METADATA.userAgent); + headers.set( + conf.uaHeader ?? "user-agent", + conf.userAgent ?? SDK_METADATA.userAgent, + ); } const fetchOptions: Omit = { diff --git a/src/mcp-server/build.mts b/src/mcp-server/build.mts index 33c5b89..65e8a31 100644 --- a/src/mcp-server/build.mts +++ b/src/mcp-server/build.mts @@ -2,7 +2,7 @@ import { build } from "bun"; import { chmod, copyFile, mkdir } from "node:fs/promises"; -import { packExtension } from "@anthropic-ai/dxt"; +import { packExtension } from "@anthropic-ai/mcpb"; import { join } from "node:path"; async function buildMcpServer() { @@ -24,17 +24,17 @@ async function buildMcpServer() { const outputFile = join(destinationDir, "mcp-server.js"); await chmod(outputFile, 0o755); - // Build the DXT file + // Build the MCP bundle file await packExtension({ extensionPath: ".", - outputPath: "mcp-server.dxt", + outputPath: "mcp-server.mcpb", silent: false, }); - // Copy the DXT file to `./static` to have the CloudFlare Worker serve it + // Copy the MCP bundle file to `./static` to have the CloudFlare Worker serve it const staticDir = "./static"; await mkdir(staticDir, { recursive: true }); - await copyFile("mcp-server.dxt", join(staticDir, "mcp-server.dxt")); + await copyFile("mcp-server.mcpb", join(staticDir, "mcp-server.mcpb")); } await buildMcpServer().catch((error) => { diff --git a/src/mcp-server/mcp-server.ts b/src/mcp-server/mcp-server.ts index f905f2f..9bc9f7b 100644 --- a/src/mcp-server/mcp-server.ts +++ b/src/mcp-server/mcp-server.ts @@ -19,7 +19,7 @@ const routes = buildRouteMap({ export const app = buildApplication(routes, { name: "mcp", versionInfo: { - currentVersion: "0.0.1-beta.14", + currentVersion: "0.0.1-beta.15", }, }); diff --git a/src/mcp-server/server.ts b/src/mcp-server/server.ts index 7e8f34c..3b2e261 100644 --- a/src/mcp-server/server.ts +++ b/src/mcp-server/server.ts @@ -32,7 +32,7 @@ export function createMCPServer(deps: { }) { const server = new McpServer({ name: "FireHydrant", - version: "0.0.1-beta.14", + version: "0.0.1-beta.15", }); const getClient = deps.getSDK || (() => diff --git a/src/mcp-server/tools.ts b/src/mcp-server/tools.ts index 0055115..9153fa9 100644 --- a/src/mcp-server/tools.ts +++ b/src/mcp-server/tools.ts @@ -21,6 +21,13 @@ export type ToolDefinition = description: string; scopes?: MCPScope[]; args: Args; + annotations: { + title: string; + destructiveHint: boolean; + idempotentHint: boolean; + openWorldHint: boolean; + readOnlyHint: boolean; + }; tool: ( client: FireHydrantCore, args: objectOutputType, @@ -32,6 +39,13 @@ export type ToolDefinition = description: string; scopes?: MCPScope[]; args?: undefined; + annotations: { + title: string; + destructiveHint: boolean; + idempotentHint: boolean; + openWorldHint: boolean; + readOnlyHint: boolean; + }; tool: ( client: FireHydrantCore, extra: RequestHandlerExtra, @@ -119,13 +133,24 @@ export function createRegisterTool( } if (tool.args) { - server.tool(tool.name, tool.description, tool.args, async (args, ctx) => { - return tool.tool(getSDK(), args, ctx); - }); + server.tool( + tool.name, + tool.description, + tool.args, + tool.annotations, + async (args, ctx) => { + return tool.tool(getSDK(), args, ctx); + }, + ); } else { - server.tool(tool.name, tool.description, async (ctx) => { - return tool.tool(getSDK(), ctx); - }); + server.tool( + tool.name, + tool.description, + tool.annotations, + async (_, ctx) => { + return tool.tool(getSDK(), ctx); + }, + ); } logger.debug("Registered tool", { name: tool.name }); diff --git a/src/mcp-server/tools/alertsListAlerts.ts b/src/mcp-server/tools/alertsListAlerts.ts index 8562b79..dd877af 100644 --- a/src/mcp-server/tools/alertsListAlerts.ts +++ b/src/mcp-server/tools/alertsListAlerts.ts @@ -14,8 +14,15 @@ export const tool$alertsListAlerts: ToolDefinition = { name: "list-alerts", description: `List alerts -Retrieve all alerts from third parties`, +Retrieve all alerts, including Signals alerts and third-party`, scopes: ["read"], + annotations: { + "title": "", + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false, + }, args, tool: async (client, args, ctx) => { const [result, apiCall] = await alertsListAlerts( diff --git a/src/mcp-server/tools/incidentsCreateIncident.ts b/src/mcp-server/tools/incidentsCreateIncident.ts index 8891beb..320f4d9 100644 --- a/src/mcp-server/tools/incidentsCreateIncident.ts +++ b/src/mcp-server/tools/incidentsCreateIncident.ts @@ -16,6 +16,13 @@ export const tool$incidentsCreateIncident: ToolDefinition = { Create a new incident`, scopes: ["read", "write"], + annotations: { + "title": "", + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false, + }, args, tool: async (client, args, ctx) => { const [result, apiCall] = await incidentsCreateIncident( diff --git a/src/mcp-server/tools/incidentsListIncidents.ts b/src/mcp-server/tools/incidentsListIncidents.ts index 7ef29fb..0fd40ec 100644 --- a/src/mcp-server/tools/incidentsListIncidents.ts +++ b/src/mcp-server/tools/incidentsListIncidents.ts @@ -16,6 +16,13 @@ export const tool$incidentsListIncidents: ToolDefinition = { List all of the incidents in the organization`, scopes: ["read"], + annotations: { + "title": "", + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false, + }, args, tool: async (client, args, ctx) => { const [result, apiCall] = await incidentsListIncidents( diff --git a/src/mcp-server/tools/retrospectivesListIncidentRetrospectives.ts b/src/mcp-server/tools/retrospectivesListIncidentRetrospectives.ts index e1bd899..532e6c0 100644 --- a/src/mcp-server/tools/retrospectivesListIncidentRetrospectives.ts +++ b/src/mcp-server/tools/retrospectivesListIncidentRetrospectives.ts @@ -22,6 +22,13 @@ export const tool$retrospectivesListIncidentRetrospectives: ToolDefinition< - Getting the fields of a retrospective. `, scopes: ["read"], + annotations: { + "title": "", + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false, + }, args, tool: async (client, args, ctx) => { const [result, apiCall] = await retrospectivesListIncidentRetrospectives( diff --git a/src/mcp-server/tools/retrospectivesUpdateIncidentRetrospectiveField.ts b/src/mcp-server/tools/retrospectivesUpdateIncidentRetrospectiveField.ts index 6a25c35..3a90ea1 100644 --- a/src/mcp-server/tools/retrospectivesUpdateIncidentRetrospectiveField.ts +++ b/src/mcp-server/tools/retrospectivesUpdateIncidentRetrospectiveField.ts @@ -22,6 +22,13 @@ export const tool$retrospectivesUpdateIncidentRetrospectiveField: The value should be unstyled HTML. `, scopes: ["read", "write"], + annotations: { + "title": "", + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false, + }, args, tool: async (client, args, ctx) => { const [result, apiCall] = diff --git a/src/models/nullablesignalsapiruleentity.ts b/src/models/nullablesignalsapiruleentity.ts index eccb62a..6624ecd 100644 --- a/src/models/nullablesignalsapiruleentity.ts +++ b/src/models/nullablesignalsapiruleentity.ts @@ -20,6 +20,7 @@ export const NotificationPriorityOverride$zodSchema = z.enum([ "HIGH", "MEDIUM", "LOW", + "", ]); export type NotificationPriorityOverride = z.infer< diff --git a/src/models/security.ts b/src/models/security.ts index be4cc5d..83f338a 100644 --- a/src/models/security.ts +++ b/src/models/security.ts @@ -8,5 +8,5 @@ export type Security = { api_key: string }; export const Security$zodSchema: z.ZodType = z .object({ - api_key: z.string(), + api_key: z.string().describe("API Key"), }); diff --git a/tsconfig.json b/tsconfig.json index 7307aef..0ca4894 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -28,7 +28,6 @@ "sourceMap": true, "strict": true, "target": "es2022", - "tsBuildInfoFile": ".tsbuildinfo", "useUnknownInCatchVariables": true, }, "exclude": ["node_modules"],