Programming Quotes · Capability

Programming Quotes API — Quotes

Programming Quotes — Quotes. 8 operations. Lead operation: Programming Quotes Get Random Quote. Self-contained Naftiko capability covering one Programming Quotes business surface.

Run with Naftiko Programming QuotesQuotesOpen Source

What You Can Do

GET
Getrandomquote — Return a single random programming quote.
/v1/quotes/random
GET
Listquotes — Return a paginated list of programming quotes.
/v1/quotes
POST
Createquote — Create a new programming quote.
/v1/quotes
GET
Getquotebyid — Fetch a single quote by identifier.
/v1/quotes/{id}
PUT
Updatequote — Update an existing quote.
/v1/quotes/{id}
DELETE
Deletequote — Delete a quote.
/v1/quotes/{id}
POST
Addfavoritequote — Mark a quote as favorite.
/v1/quotes/favorite/{id}
POST
Votequote — Submit a 1-5 vote for a quote.
/v1/quotes/vote/{id}

MCP Tools

get-random-quote

Return a single random programming quote.

read-only idempotent
list-quotes

Return a paginated list of programming quotes.

read-only idempotent
create-quote

Create a new programming quote (requires JWT).

get-quote-by-id

Fetch a single quote by identifier.

read-only idempotent
update-quote

Update an existing quote (requires JWT).

idempotent
delete-quote

Delete a quote by ID (requires JWT).

idempotent
add-favorite-quote

Mark a quote as a favorite for the authenticated user.

idempotent
vote-quote

Submit a 1-5 vote for a quote (requires JWT).

Capability Spec

programming-quotes-quotes.yaml Raw ↑
naftiko: "1.0.0-alpha2"

info:
  label: "Programming Quotes API — Quotes"
  description: >-
    Programming Quotes — Quotes. 8 operations. Lead operation: Programming Quotes Get
    Random Quote. Self-contained Naftiko capability covering one Programming Quotes
    business surface.
  tags:
    - Programming Quotes
    - Quotes
    - Open Source
  created: "2026-05-30"
  modified: "2026-05-30"

binds:
  - namespace: env
    keys:
      PROGRAMMING_QUOTES_TOKEN: PROGRAMMING_QUOTES_TOKEN

capability:

  # ── 1. Consumes — upstream Programming Quotes HTTP surface ────────────
  consumes:
    - type: http
      namespace: "programming-quotes-quotes"
      baseUri: "https://programming-quotes-api.azurewebsites.net/api"
      description: "Programming Quotes API — Quotes business capability. Self-contained, no shared references."
      authentication:
        type: bearer
        token: "{{env.PROGRAMMING_QUOTES_TOKEN}}"
      resources:
        - name: "quotes-random"
          path: "/quotes/random"
          operations:
            - name: "getRandomQuote"
              method: GET
              description: "Return a single random programming quote from the corpus."
              outputRawFormat: json
              outputParameters:
                - name: result
                  type: object
                  value: "$."
        - name: "quotes"
          path: "/quotes"
          operations:
            - name: "listQuotes"
              method: GET
              description: "Return a paginated list of programming quotes, optionally filtered by author."
              inputParameters:
                - name: "page"
                  in: query
                  type: integer
                  required: false
                  description: "1-based page number."
                - name: "quotesPerPage"
                  in: query
                  type: integer
                  required: false
                  description: "Number of quotes per page."
                - name: "author"
                  in: query
                  type: string
                  required: false
                  description: "Filter by author name (underscores for spaces)."
              outputRawFormat: json
              outputParameters:
                - name: result
                  type: object
                  value: "$."
            - name: "createQuote"
              method: POST
              description: "Create a new programming quote (requires JWT)."
              inputParameters:
                - name: "body"
                  in: body
                  type: object
                  required: true
                  description: "Quote payload (author, text, optional source)."
              outputRawFormat: json
              outputParameters:
                - name: result
                  type: object
                  value: "$."
        - name: "quotes-by-id"
          path: "/quotes/{id}"
          operations:
            - name: "getQuoteById"
              method: GET
              description: "Fetch a single quote by its identifier."
              inputParameters:
                - name: "id"
                  in: path
                  type: string
                  required: true
                  description: "Quote identifier (MongoDB ObjectId)."
              outputRawFormat: json
              outputParameters:
                - name: result
                  type: object
                  value: "$."
            - name: "updateQuote"
              method: PUT
              description: "Update an existing quote's author, text, or source (requires JWT)."
              inputParameters:
                - name: "id"
                  in: path
                  type: string
                  required: true
                  description: "Quote identifier."
                - name: "body"
                  in: body
                  type: object
                  required: true
                  description: "Partial quote update payload."
              outputRawFormat: json
              outputParameters:
                - name: result
                  type: object
                  value: "$."
            - name: "deleteQuote"
              method: DELETE
              description: "Delete a quote by ID (requires JWT)."
              inputParameters:
                - name: "id"
                  in: path
                  type: string
                  required: true
                  description: "Quote identifier."
              outputRawFormat: json
              outputParameters:
                - name: result
                  type: object
                  value: "$."
        - name: "quotes-favorite"
          path: "/quotes/favorite/{id}"
          operations:
            - name: "addFavoriteQuote"
              method: POST
              description: "Mark a quote as a favorite for the authenticated user."
              inputParameters:
                - name: "id"
                  in: path
                  type: string
                  required: true
                  description: "Quote identifier."
              outputRawFormat: json
              outputParameters:
                - name: result
                  type: object
                  value: "$."
        - name: "quotes-vote"
          path: "/quotes/vote/{id}"
          operations:
            - name: "voteQuote"
              method: POST
              description: "Submit a 1-5 vote for a quote on behalf of the authenticated user."
              inputParameters:
                - name: "id"
                  in: path
                  type: string
                  required: true
                  description: "Quote identifier."
                - name: "body"
                  in: body
                  type: object
                  required: true
                  description: "Vote payload `{newVote: 1..5}`."
              outputRawFormat: json
              outputParameters:
                - name: result
                  type: object
                  value: "$."

  # ── 2. REST exposer ────────────────────────────────────────────────────
  exposes:
    - type: rest
      namespace: "programming-quotes-quotes-rest"
      port: 8080
      description: "REST adapter for Programming Quotes — Quotes. One Spectral-compliant resource per consumed operation, prefixed with /v1."
      resources:
        - path: "/v1/quotes/random"
          name: "quotes-random"
          description: "REST surface for the random quote endpoint."
          operations:
            - method: GET
              name: "getRandomQuote"
              description: "Return a single random programming quote."
              call: "programming-quotes-quotes.getRandomQuote"
              outputParameters:
                - type: object
                  mapping: "$."
        - path: "/v1/quotes"
          name: "quotes"
          description: "REST surface for the quotes collection."
          operations:
            - method: GET
              name: "listQuotes"
              description: "Return a paginated list of programming quotes."
              call: "programming-quotes-quotes.listQuotes"
              with:
                "page": "rest.page"
                "quotesPerPage": "rest.quotesPerPage"
                "author": "rest.author"
              outputParameters:
                - type: object
                  mapping: "$."
            - method: POST
              name: "createQuote"
              description: "Create a new programming quote."
              call: "programming-quotes-quotes.createQuote"
              with:
                "body": "rest.body"
              outputParameters:
                - type: object
                  mapping: "$."
        - path: "/v1/quotes/{id}"
          name: "quotes-by-id"
          description: "REST surface for a single quote."
          operations:
            - method: GET
              name: "getQuoteById"
              description: "Fetch a single quote by identifier."
              call: "programming-quotes-quotes.getQuoteById"
              with:
                "id": "rest.id"
              outputParameters:
                - type: object
                  mapping: "$."
            - method: PUT
              name: "updateQuote"
              description: "Update an existing quote."
              call: "programming-quotes-quotes.updateQuote"
              with:
                "id": "rest.id"
                "body": "rest.body"
              outputParameters:
                - type: object
                  mapping: "$."
            - method: DELETE
              name: "deleteQuote"
              description: "Delete a quote."
              call: "programming-quotes-quotes.deleteQuote"
              with:
                "id": "rest.id"
              outputParameters:
                - type: object
                  mapping: "$."
        - path: "/v1/quotes/favorite/{id}"
          name: "quotes-favorite"
          description: "REST surface for favoriting a quote."
          operations:
            - method: POST
              name: "addFavoriteQuote"
              description: "Mark a quote as favorite."
              call: "programming-quotes-quotes.addFavoriteQuote"
              with:
                "id": "rest.id"
              outputParameters:
                - type: object
                  mapping: "$."
        - path: "/v1/quotes/vote/{id}"
          name: "quotes-vote"
          description: "REST surface for voting on a quote."
          operations:
            - method: POST
              name: "voteQuote"
              description: "Submit a 1-5 vote for a quote."
              call: "programming-quotes-quotes.voteQuote"
              with:
                "id": "rest.id"
                "body": "rest.body"
              outputParameters:
                - type: object
                  mapping: "$."

    # ── 3. MCP exposer ──────────────────────────────────────────────────
    - type: mcp
      namespace: "programming-quotes-quotes-mcp"
      port: 9090
      transport: http
      description: "MCP adapter for Programming Quotes — Quotes. One tool per consumed operation, routed inline through this capability's consumes block."
      tools:
        - name: "get-random-quote"
          description: "Return a single random programming quote."
          hints:
            readOnly: true
            destructive: false
            idempotent: true
          call: "programming-quotes-quotes.getRandomQuote"
          outputParameters:
            - type: object
              mapping: "$."
        - name: "list-quotes"
          description: "Return a paginated list of programming quotes."
          hints:
            readOnly: true
            destructive: false
            idempotent: true
          call: "programming-quotes-quotes.listQuotes"
          with:
            "page": "tools.page"
            "quotesPerPage": "tools.quotesPerPage"
            "author": "tools.author"
          outputParameters:
            - type: object
              mapping: "$."
        - name: "create-quote"
          description: "Create a new programming quote (requires JWT)."
          hints:
            readOnly: false
            destructive: false
            idempotent: false
          call: "programming-quotes-quotes.createQuote"
          with:
            "body": "tools.body"
          outputParameters:
            - type: object
              mapping: "$."
        - name: "get-quote-by-id"
          description: "Fetch a single quote by identifier."
          hints:
            readOnly: true
            destructive: false
            idempotent: true
          call: "programming-quotes-quotes.getQuoteById"
          with:
            "id": "tools.id"
          outputParameters:
            - type: object
              mapping: "$."
        - name: "update-quote"
          description: "Update an existing quote (requires JWT)."
          hints:
            readOnly: false
            destructive: false
            idempotent: true
          call: "programming-quotes-quotes.updateQuote"
          with:
            "id": "tools.id"
            "body": "tools.body"
          outputParameters:
            - type: object
              mapping: "$."
        - name: "delete-quote"
          description: "Delete a quote by ID (requires JWT)."
          hints:
            readOnly: false
            destructive: true
            idempotent: true
          call: "programming-quotes-quotes.deleteQuote"
          with:
            "id": "tools.id"
          outputParameters:
            - type: object
              mapping: "$."
        - name: "add-favorite-quote"
          description: "Mark a quote as a favorite for the authenticated user."
          hints:
            readOnly: false
            destructive: false
            idempotent: true
          call: "programming-quotes-quotes.addFavoriteQuote"
          with:
            "id": "tools.id"
          outputParameters:
            - type: object
              mapping: "$."
        - name: "vote-quote"
          description: "Submit a 1-5 vote for a quote (requires JWT)."
          hints:
            readOnly: false
            destructive: false
            idempotent: false
          call: "programming-quotes-quotes.voteQuote"
          with:
            "id": "tools.id"
            "body": "tools.body"
          outputParameters:
            - type: object
              mapping: "$."