Files
kong-workforce-api/kong/mcp/ai-mcp-proxy.yaml
T
Stéphane Tailland 8db2bb6e39 refactor(mcp): generate the tool definitions from the spec
Produced by k8s-platform/tools/generate-mcp-tools.py: deck file openapi2mcp
does the conversion, and the wrapper re-injects the five things Kong's
generator cannot emit — per-tool ACLs, the MCP behavioural annotations, the
response schemas the plugin uses for structuredOutput, the real upstream host,
and JSON-only request bodies. Each is a documented gap; see
k8s-platform/MCP-TOOL-GENERATION.md.

tools-policy.yaml carries the ACLs and doubles as the allow-list: an operation
becomes a tool only if the policy names it. Kong would otherwise expose every
operation in the spec, DELETE included, and can express no authorization at all
from a bearer-token spec — silently, exit 0, no warning.

Same tools as before, same ACLs. What changed: query parameters are now
declared and callable, each tool carries its response schema so calls return
structured content instead of raw JSON, and request bodies are no longer
tripled across three identical content types.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 08:48:45 +02:00

837 lines
25 KiB
YAML

# GENERATED — do not edit. Edit openapi.yaml or tools-policy.yaml, then:
# k8s-platform/tools/generate-mcp-tools.py <this domain>
#
# Produced by `deck file openapi2mcp`, then post-processed to add the ACLs,
# the MCP behavioural annotations, the response schemas, the real upstream
# host and the JSON-only bodies that Kong's generator does not emit. Each of
# those is a documented gap — see k8s-platform/MCP-TOOL-GENERATION.md.
apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
name: ${NAME}-workforce-mcp-ai-mcp-proxy
namespace: ${NAMESPACE}
plugin: ai-mcp-proxy
config:
mode: conversion-listener
include_consumer_groups: true
tools:
- annotations:
title: List all offices
read_only_hint: true
idempotent_hint: true
destructive_hint: false
open_world_hint: false
description: Retrieve a paginated list of all company office locations worldwide.
method: GET
name: list-offices
parameters:
- description: A page number within the paginated result set.
in: query
name: page
required: false
schema:
type: integer
- description: Number of results to return per page.
in: query
name: page_size
required: false
schema:
type: integer
path: /workforce/v1/offices/
acl:
allow:
- admin
- read_only
- product_manager
- support
scheme: http
host: ${REST_HOSTNAME}
responses:
'200':
content:
application/json:
schema:
type: object
properties:
count:
type: integer
example: 123
next:
type: string
nullable: true
format: uri
example: http://api.example.org/accounts/?page=4
previous:
type: string
nullable: true
format: uri
example: http://api.example.org/accounts/?page=2
results:
type: array
items:
type: object
description: Company office locations
properties:
officecode:
type: string
maxLength: 10
city:
type: string
maxLength: 50
phone:
type: string
maxLength: 50
addressline1:
type: string
maxLength: 50
addressline2:
type: string
nullable: true
maxLength: 50
state:
type: string
nullable: true
maxLength: 50
country:
type: string
maxLength: 50
postalcode:
type: string
maxLength: 15
territory:
type: string
maxLength: 10
required:
- addressline1
- city
- country
- officecode
- phone
- postalcode
- territory
- annotations:
title: Get a specific office
read_only_hint: true
idempotent_hint: true
destructive_hint: false
open_world_hint: false
description: Retrieve detailed information about a specific office by its code.
method: GET
name: get-office
parameters:
- description: A unique value identifying this office.
in: path
name: officecode
required: true
schema:
type: string
path: /workforce/v1/offices/{officecode}/
acl:
allow:
- admin
- read_only
- product_manager
- support
scheme: http
host: ${REST_HOSTNAME}
responses:
'200':
content:
application/json:
schema:
type: object
description: Company office locations
properties:
officecode:
type: string
maxLength: 10
city:
type: string
maxLength: 50
phone:
type: string
maxLength: 50
addressline1:
type: string
maxLength: 50
addressline2:
type: string
nullable: true
maxLength: 50
state:
type: string
nullable: true
maxLength: 50
country:
type: string
maxLength: 50
postalcode:
type: string
maxLength: 15
territory:
type: string
maxLength: 10
required:
- addressline1
- city
- country
- officecode
- phone
- postalcode
- territory
- annotations:
title: Get employees by office
read_only_hint: true
idempotent_hint: true
destructive_hint: false
open_world_hint: false
description: Retrieve all employees working in a specific office. This endpoint supports office management
and organizational charts.
method: GET
name: get-office-employees
parameters:
- description: The office code
in: path
name: officecode
required: true
schema:
type: string
- description: A page number within the paginated result set.
in: query
name: page
required: false
schema:
type: integer
- description: Number of results to return per page.
in: query
name: page_size
required: false
schema:
type: integer
path: /workforce/v1/offices/{officecode}/employees/
acl:
allow:
- admin
- read_only
- product_manager
- support
scheme: http
host: ${REST_HOSTNAME}
responses:
'200':
content:
application/json:
schema:
type: object
properties:
count:
type: integer
example: 123
next:
type: string
nullable: true
format: uri
example: http://api.example.org/accounts/?page=4
previous:
type: string
nullable: true
format: uri
example: http://api.example.org/accounts/?page=2
results:
type: array
items:
type: object
description: Employee information and hierarchy
properties:
employeenumber:
type: integer
maximum: 2147483647
minimum: -2147483648
lastname:
type: string
maxLength: 50
firstname:
type: string
maxLength: 50
extension:
type: string
maxLength: 10
email:
type: string
maxLength: 100
jobtitle:
type: string
maxLength: 50
officecode:
type: string
reportsto:
type: integer
maximum: 2147483647
minimum: -2147483648
nullable: true
required:
- email
- employeenumber
- extension
- firstname
- jobtitle
- lastname
- officecode
- annotations:
title: Create a new office
read_only_hint: false
idempotent_hint: false
destructive_hint: false
open_world_hint: false
description: Add a new office location to the company's network.
method: POST
name: create-office
path: /workforce/v1/offices/
request_body:
content:
application/json:
schema:
properties:
addressline1:
type: string
addressline2:
type: string
city:
type: string
country:
type: string
officecode:
type: string
phone:
type: string
postalcode:
type: string
state:
type: string
territory:
type: string
required:
- addressline1
- city
- country
- officecode
- phone
- postalcode
- territory
type: object
required: true
acl:
allow:
- admin
scheme: http
host: ${REST_HOSTNAME}
responses:
'201':
content:
application/json:
schema:
type: object
description: Company office locations
properties:
officecode:
type: string
maxLength: 10
city:
type: string
maxLength: 50
phone:
type: string
maxLength: 50
addressline1:
type: string
maxLength: 50
addressline2:
type: string
nullable: true
maxLength: 50
state:
type: string
nullable: true
maxLength: 50
country:
type: string
maxLength: 50
postalcode:
type: string
maxLength: 15
territory:
type: string
maxLength: 10
required:
- addressline1
- city
- country
- officecode
- phone
- postalcode
- territory
- annotations:
title: List all employees
read_only_hint: true
idempotent_hint: true
destructive_hint: false
open_world_hint: false
description: Retrieve a paginated list of all employees in the organization with their details.
method: GET
name: list-employees
parameters:
- description: A page number within the paginated result set.
in: query
name: page
required: false
schema:
type: integer
- description: Number of results to return per page.
in: query
name: page_size
required: false
schema:
type: integer
path: /workforce/v1/employees/
acl:
allow:
- admin
- read_only
- product_manager
- support
scheme: http
host: ${REST_HOSTNAME}
responses:
'200':
content:
application/json:
schema:
type: object
properties:
count:
type: integer
example: 123
next:
type: string
nullable: true
format: uri
example: http://api.example.org/accounts/?page=4
previous:
type: string
nullable: true
format: uri
example: http://api.example.org/accounts/?page=2
results:
type: array
items:
type: object
description: Employee information and hierarchy
properties:
employeenumber:
type: integer
maximum: 2147483647
minimum: -2147483648
lastname:
type: string
maxLength: 50
firstname:
type: string
maxLength: 50
extension:
type: string
maxLength: 10
email:
type: string
maxLength: 100
jobtitle:
type: string
maxLength: 50
officecode:
type: string
reportsto:
type: integer
maximum: 2147483647
minimum: -2147483648
nullable: true
required:
- email
- employeenumber
- extension
- firstname
- jobtitle
- lastname
- officecode
- annotations:
title: Get a specific employee
read_only_hint: true
idempotent_hint: true
destructive_hint: false
open_world_hint: false
description: Retrieve detailed information about a specific employee by their employee number.
method: GET
name: get-employee
parameters:
- description: A unique value identifying this employee.
in: path
name: employeenumber
required: true
schema:
type: integer
path: /workforce/v1/employees/{employeenumber}/
acl:
allow:
- admin
- read_only
- product_manager
- support
scheme: http
host: ${REST_HOSTNAME}
responses:
'200':
content:
application/json:
schema:
type: object
description: Employee information and hierarchy
properties:
employeenumber:
type: integer
maximum: 2147483647
minimum: -2147483648
lastname:
type: string
maxLength: 50
firstname:
type: string
maxLength: 50
extension:
type: string
maxLength: 10
email:
type: string
maxLength: 100
jobtitle:
type: string
maxLength: 50
officecode:
type: string
reportsto:
type: integer
maximum: 2147483647
minimum: -2147483648
nullable: true
required:
- email
- employeenumber
- extension
- firstname
- jobtitle
- lastname
- officecode
- annotations:
title: Get employees by manager
read_only_hint: true
idempotent_hint: true
destructive_hint: false
open_world_hint: false
description: Retrieve all employees reporting to a specific manager. This endpoint supports organizational
hierarchy and team management.
method: GET
name: get-employee-reports
parameters:
- description: The employee number of the manager
in: path
name: employeenumber
required: true
schema:
type: integer
- description: A page number within the paginated result set.
in: query
name: page
required: false
schema:
type: integer
- description: Number of results to return per page.
in: query
name: page_size
required: false
schema:
type: integer
path: /workforce/v1/employees/{employeenumber}/reports/
acl:
allow:
- admin
- read_only
- product_manager
- support
scheme: http
host: ${REST_HOSTNAME}
responses:
'200':
content:
application/json:
schema:
type: object
properties:
count:
type: integer
example: 123
next:
type: string
nullable: true
format: uri
example: http://api.example.org/accounts/?page=4
previous:
type: string
nullable: true
format: uri
example: http://api.example.org/accounts/?page=2
results:
type: array
items:
type: object
description: Employee information and hierarchy
properties:
employeenumber:
type: integer
maximum: 2147483647
minimum: -2147483648
lastname:
type: string
maxLength: 50
firstname:
type: string
maxLength: 50
extension:
type: string
maxLength: 10
email:
type: string
maxLength: 100
jobtitle:
type: string
maxLength: 50
officecode:
type: string
reportsto:
type: integer
maximum: 2147483647
minimum: -2147483648
nullable: true
required:
- email
- employeenumber
- extension
- firstname
- jobtitle
- lastname
- officecode
- annotations:
title: Get customers by sales rep
read_only_hint: true
idempotent_hint: true
destructive_hint: false
open_world_hint: false
description: Retrieve all customers assigned to a specific sales representative. This endpoint supports
sales rep performance tracking and customer management.
method: GET
name: get-employee-customers
parameters:
- description: The employee number of the sales representative
in: path
name: employeenumber
required: true
schema:
type: integer
- description: A page number within the paginated result set.
in: query
name: page
required: false
schema:
type: integer
- description: Number of results to return per page.
in: query
name: page_size
required: false
schema:
type: integer
path: /workforce/v1/employees/{employeenumber}/customers/
acl:
allow:
- admin
- read_only
- product_manager
- support
scheme: http
host: ${REST_HOSTNAME}
responses:
'200':
content:
application/json:
schema:
type: object
properties:
count:
type: integer
example: 123
next:
type: string
nullable: true
format: uri
example: http://api.example.org/accounts/?page=4
previous:
type: string
nullable: true
format: uri
example: http://api.example.org/accounts/?page=2
results:
type: array
items:
type: object
description: Customer information and contact details
properties:
customernumber:
type: integer
maximum: 2147483647
minimum: -2147483648
customername:
type: string
maxLength: 50
contactlastname:
type: string
maxLength: 50
contactfirstname:
type: string
maxLength: 50
phone:
type: string
maxLength: 50
addressline1:
type: string
maxLength: 50
addressline2:
type: string
nullable: true
maxLength: 50
city:
type: string
maxLength: 50
state:
type: string
nullable: true
maxLength: 50
postalcode:
type: string
nullable: true
maxLength: 15
country:
type: string
maxLength: 50
creditlimit:
type: string
format: decimal
pattern: ^-?\d{0,8}(?:\.\d{0,2})?$
nullable: true
salesrepemployeenumber:
type: integer
maximum: 2147483647
minimum: -2147483648
nullable: true
required:
- addressline1
- city
- contactfirstname
- contactlastname
- country
- customername
- customernumber
- phone
- annotations:
title: Create a new employee
read_only_hint: false
idempotent_hint: false
destructive_hint: false
open_world_hint: false
description: Add a new employee to the organization with their job details and office assignment.
method: POST
name: create-employee
path: /workforce/v1/employees/
request_body:
content:
application/json:
schema:
properties:
email:
type: string
employeenumber:
type: integer
extension:
type: string
firstname:
type: string
jobtitle:
type: string
lastname:
type: string
officecode:
type: string
reportsto:
type: integer
required:
- email
- employeenumber
- extension
- firstname
- jobtitle
- lastname
- officecode
type: object
required: true
acl:
allow:
- admin
scheme: http
host: ${REST_HOSTNAME}
responses:
'201':
content:
application/json:
schema:
type: object
description: Employee information and hierarchy
properties:
employeenumber:
type: integer
maximum: 2147483647
minimum: -2147483648
lastname:
type: string
maxLength: 50
firstname:
type: string
maxLength: 50
extension:
type: string
maxLength: 10
email:
type: string
maxLength: 100
jobtitle:
type: string
maxLength: 50
officecode:
type: string
reportsto:
type: integer
maximum: 2147483647
minimum: -2147483648
nullable: true
required:
- email
- employeenumber
- extension
- firstname
- jobtitle
- lastname
- officecode