# Backstage MCP

This is an example of using [Backstage](https://backstage.io) with [MCP](https://github.com/Backstage/mcp) via [Quarkus Backstage](https://github.com/quarkiverse/quarkus-backstage).
The server has been tested with [Goose](https://github.com/block/goose). See below for details. 

## Features

- List available Backstage templates
- Instantiate a template from the command line

## Requirements
A [Backstage](https://backstage.io) installation is required.
The installation needs to have enabled [Service to Service](https://backstage.io/docs/auth/service-to-service-auth/) communication.
Users need to have access of the token used for such communication. The `yaml` snippet below shows where and how it's setup.

```yaml
app:
# ...
backend:
  # ... 
  auth:
    # ...
    externalAccess:
      - type: static
        options:
          token: <put your token here>
          subject: curl-requests
```

## Anatomy

### Dependencies 

The project is using:

```xml
        <dependency>
            <groupId>io.quarkiverse.mcp</groupId>
            <artifactId>quarkus-mcp-server-stdio</artifactId>
            <version>1.0.0.Alpha5</version>
        </dependency>
```        

for implementing an mcp server that reads from stdin and writes to stdout.

It also uses:

```xml
        <dependency>
            <groupId>io.quarkiverse.backstage</groupId>
            <artifactId>quarkus-backstage</artifactId>
            <version>0.4.1</version>
        </dependency>

```

For talking to the [Backstage](https://backstage.io) API.

### The implementation

The implementation is pretty straight forward, as there is a tiny file needed:
[[src/main/java/org/acme/Backstage.java]]

## Setting up goose

[Goose](https://github.com/block/goose) is an local AI agent that runs as an interactive shell and is supports plugins (including mcp servers).

To setup goose so that it uses this mcp server add the followng extension to your config.yaml:

```yaml
  quarkus-backstage-mcp:
    args:
    - --quiet
    - /home/iocanel/demo/backstage-mcp/target/quarkus-app/quarkus-run.jar
    cmd: jbang
    enabled: true
    envs: {}
    name: quarkus-backstage-mcp
    type: stdio
```

### Sample prompts

#### Listing the templates
```bash
list all the available backstage templates
```

### Instantiating a template

To instantiate a template one needs values.yaml file containing the template parameters to use.
The default values can be extracted from the template using the backstage CLI:

```sh
quarkus backstage template info --show-default-values <template name>
```

The output can be saved to a file, say `values.yaml` and then used to instantiate the template from a goose session:

```sh
create a new project from template <template name> using values from values.yaml
```

