
The typespec-create-api-plugin skill generates complete TypeSpec API plugin files configured for Microsoft 365 Copilot, including REST operations, authentication schemes, and Adaptive Card responses. It serves developers who need to integrate external REST APIs with Microsoft 365 Copilot by automating the creation of TypeSpec agent definitions and action files with proper decorators and models. The skill solves the problem of manually structuring complex TypeSpec configurations by providing templated files that support multiple authentication options and response formatting capabilities.
$ npx -y skills add github/awesome-copilot --skill typespec-create-api-plugin --agent claude-codeInstalls into .claude/skills of the current project.
Create a complete TypeSpec API plugin for Microsoft 365 Copilot that integrates with external REST APIs.
Generate TypeSpec files with:
import "@typespec/http";
import "@typespec/openapi3";
import "@microsoft/typespec-m365-copilot";
import "./actions.tsp";
using TypeSpec.Http;
using TypeSpec.M365.Copilot.Agents;
using TypeSpec.M365.Copilot.Actions;
@agent({
name: "[Agent Name]",
description: "[Description]"
})
@instructions("""
[Instructions for using the API operations]
""")
namespace [AgentName] {
// Reference operations from actions.tsp
op operation1 is [APINamespace].operationName;
}
import "@typespec/http";
import "@microsoft/typespec-m365-copilot";
using TypeSpec.Http;
using TypeSpec.M365.Copilot.Actions;
@service
@actions(#{
nameForHuman: "[API Display Name]",
descriptionForModel: "[Model description]",
descriptionForHuman: "[User description]"
})
@server("[API_BASE_URL]", "[API Name]")
@useAuth([AuthType]) // Optional
namespace [APINamespace] {
@route("[/path]")
@get
@action
op operationName(
@path param1: string,
@query param2?: string
): ResponseModel;
model ResponseModel {
// Response structure
}
}
Choose based on API requirements:
No Authentication (Public APIs)
// No @useAuth decorator needed
API Key
@useAuth(ApiKeyAuth<ApiKeyLocation.header, "X-API-Key">)
OAuth2
@useAuth(OAuth2Auth<[{
type: OAuth2FlowType.authorizationCode;
authorizationUrl: "https://oauth.example.com/authorize";
tokenUrl: "https://oauth.example.com/token";
refreshUrl: "https://oauth.example.com/token";
scopes: ["read", "write"];
}]>)
Registered Auth Reference
@useAuth(Auth)
@authReferenceId("registration-id-here")
model Auth is ApiKeyAuth<ApiKeyLocation.header, "X-API-Key">
@capabilities(#{
confirmation: #{
type: "AdaptiveCard",
title: "Confirm Action",
body: """
Are you sure you want to perform this action?
* **Parameter**: {{ function.parameters.paramName }}
"""
}
})
@card(#{
dataPath: "$.items",
title: "$.title",
url: "$.link",
file: "cards/card.json"
})
@reasoning("""
Consider user's context when calling this operation.
Prioritize recent items over older ones.
""")
@responding("""
Present results in a clear table format with columns: ID, Title, Status.
Include a summary count at the end.
""")
Ask the user:
Then generate:
main.tsp with agent definitionactions.tsp with API operations and modelscards/card.json if Adaptive Cards are neededSponsors