diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a380142..034f030 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,6 +5,16 @@ repos: hooks: - id: update-docs + - repo: local + hooks: + - id: generate-templates + name: (Re)generate Portal Templates + entry: ansible-playbook generate_template.yaml + language: python + pass_filenames: false + additional_dependencies: + - ansible-core + - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: diff --git a/.prettierignore b/.prettierignore index bd97536..aa3e4d7 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,6 +1,7 @@ # files we don't want prettier to ever to look into .*/ coverage/ +extensions/mcp # Environments .env diff --git a/changelogs/fragments/minor_add_server_template.yaml b/changelogs/fragments/minor_add_server_template.yaml new file mode 100644 index 0000000..48f37de --- /dev/null +++ b/changelogs/fragments/minor_add_server_template.yaml @@ -0,0 +1,3 @@ +--- +minor_changes: + - Add playbook to generate template files based off role defaults for other tools to know what MCP servers a collection supports. diff --git a/extensions/mcp/servers.yaml b/extensions/mcp/servers.yaml new file mode 100644 index 0000000..8b01bd0 --- /dev/null +++ b/extensions/mcp/servers.yaml @@ -0,0 +1,17 @@ +--- +- name: github_mcp + servers: + - repository: + name: github-mcp-server + type: stdio + lang: go + args: ['stdio'] + description: GitHub MCP Server - Access GitHub repositories, issues, and pull requests +- name: aws_iam_mcp + servers: + - repository: + name: awslabs.iam-mcp-server + type: stdio + lang: pypi + args: [] + description: An MCP server for comprehensive AWS Identity and Access Management (IAM) operations. diff --git a/generate_template.yaml b/generate_template.yaml new file mode 100644 index 0000000..217be58 --- /dev/null +++ b/generate_template.yaml @@ -0,0 +1,55 @@ +# vi: ft=yaml.ansible +--- +- name: Generate portal template files + hosts: localhost + connection: local + gather_facts: false + + tasks: + - name: Collect roles + ansible.builtin.find: + file_type: directory + paths: + - "{{ playbook_dir }}/roles" + register: role_paths + + - name: Set role names + ansible.builtin.set_fact: + mcp_roles: "{{ role_paths.files | map(attribute='path') | map('basename') }}" + mcp_extension_dir: "{{ playbook_dir }}/extensions/mcp" + + - name: Create noop task file + ansible.builtin.copy: + content: "---\n# Do nothing\n" + dest: "roles/{{ item }}/tasks/noop.yaml" + mode: "0644" + loop: "{{ mcp_roles }}" + + - name: Load MCP roles to gain access to defaults + ansible.builtin.include_role: + name: "{{ item }}" + tasks_from: noop + public: true + loop: "{{ mcp_roles }}" + + - name: Zip registry with details + ansible.builtin.set_fact: + registries: >- + {{ registries | default([]) | union([{ + 'name': item, + 'registry': lookup('vars', item + '_registry', default=[]), + }]) }} + loop: "{{ mcp_roles }}" + + - name: Create destination directory + ansible.builtin.file: + dest: "{{ mcp_extension_dir }}" + state: directory + mode: "0755" + + - name: Template each registry + ansible.builtin.template: + src: server.yaml.j2 + dest: "{{ mcp_extension_dir }}/servers.yaml" + mode: "0644" + lstrip_blocks: true diff --git a/roles/github_mcp/meta/main.yml b/roles/github_mcp/meta/main.yml deleted file mode 100644 index 11738cf..0000000 --- a/roles/github_mcp/meta/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -dependencies: - - role: ansible.mcp_builder.common diff --git a/templates/server.yaml.j2 b/templates/server.yaml.j2 new file mode 100644 index 0000000..f9d0c73 --- /dev/null +++ b/templates/server.yaml.j2 @@ -0,0 +1,11 @@ +--- +{% for registry in registries if registry.registry %} +- name: {{ registry.name }} + servers: + {% for server in registry.registry %} + - repository: + {% for key, value in server.items() %} + {{key}}: {{ value }} + {% endfor %} + {% endfor %} +{% endfor %}