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"],