Spotify MCP服务器

一个连接Spotify Web API的模型上下文协议(MCP)服务器,使Microsoft Copilot Studio中的AI代理能够搜索艺术家、检索热门曲目和获取专辑信息。

  • by ifiecas
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 ifiecas/spotify-mcp

使用说明

🎵 Spotify MCP服务器

A. 模型上下文协议(MCP) 连接到Spotify Web API的服务器,使Microsoft Copilot Studio中的人工智能代理能够搜索艺术家、检索热门曲目并获取专辑信息。


🌟 特性

✅ 搜索艺术家 -按名称在Spotify上查找艺术家
✅ 搜索曲目 -按姓名、艺术家或两者搜索歌曲
✅ 获取热门曲目 -检索艺术家最受欢迎的曲目
✅ 获取相册 -列出任何Spotify艺术家的专辑
✅ 艺术家信息 -获取详细的艺术家信息(流派、关注者、受欢迎程度)
✅ 相关艺术家 -根据Spotify的推荐查找类似的艺术家
✅ 音频特征 -分析曲目的能量、可跳舞性、节奏、配价等。
✅ 曲目详细信息 -获取有关特定曲目的完整信息
✅ 专辑详情 -查看包含曲目列表的完整专辑信息
✅ 批量音频分析 -一次获得多达100首曲目的音频功能
✅ 安全认证 -使用中间件进行承载令牌身份验证
✅ Azure部署 -使用GitHub操作实现自动化CI/CD
✅ Copilot工作室就绪 -与Microsoft Copilot Studio直接集成


🏗️ 建筑

┌─────────────────────┐
│  Copilot Studio     │
│  Agent              │
└──────────┬──────────┘
           │ MCP Protocol
           │ (Streamable HTTP)
           │
┌──────────▼──────────┐
│  Azure Web App      │
│  FastMCP Server     │
│  + Auth Middleware  │
└──────────┬──────────┘
           │ REST API
           │
┌──────────▼──────────┐
│  Spotify Web API    │
└─────────────────────┘

📋 先决条件

  • Python 3.11+
  • Spotify开发者帐户
  • Azure帐户(用于部署)
  • Microsoft Copilot Studio(用于AI代理集成)

🚀 快速开始

1.克隆存储库

git clone https://github.com/ifiecas/spotify-mcp.git
cd spotify-mcp

2.设置Spotify API凭据

  1. 首选 Spotify开发者仪表板
  2. 创建新应用程序
  3. 注意你的 客户端ID 和 客户端密钥

3.创建环境变量

创建一个 .env 项目根目录中的文件:

SPOTIFY_CLIENT_ID=your_spotify_client_id
SPOTIFY_CLIENT_SECRET=your_spotify_client_secret
LOCAL_TOKEN=your_secure_token_here
PORT=8000

注: 为生成强随机令牌 LOCAL_TOKEN -这将保护您的MCP服务器。

4.安装依赖项

python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate
pip install -r requirements.txt

5.本地运行

python server.py

服务器将在以下时间启动 http://localhost:8000/mcp


☁️ 部署到Azure

选项1:自动GitHub操作(推荐)

  1. 分叉此存储库

  2. 设置Azure Web应用程序:

    • 创建Azure Web应用程序(Python 3.11)
    • 启用 系统分配的托管身份
    • 记下你的应用程序名称(例如。, spotify-mcp1611)
  3. 配置GitHub机密:

    转到您的存储库→ 设置→ 秘密与变量→ 操作,并添加:

    • AZUREAPPSERVICE_CLIENTID
    • AZUREAPPSERVICE_TENANTID
    • AZUREAPPSERVICE_SUBSCRIPTIONID
    • SPOTIFY_CLIENT_ID
    • SPOTIFY_CLIENT_SECRET
    • LOCAL_TOKEN
  4. 更新工作流文件:

    编辑 .github/workflows/main_spotify-mcp1611.yml:

    app-name: your-app-name  # Change this to your Azure Web App name
    
  5. 推送到主分支 -将触发自动部署!

选项2:手动Azure CLI部署

az login
az webapp up --name your-app-name --resource-group your-rg --runtime "PYTHON:3.11"

配置Azure环境变量

在Azure门户中→ 您的Web应用程序→ 配置→ 应用程序设置,添加:

名称 值
SPOTIFY_CLIENT_ID 您的Spotify客户端ID
SPOTIFY_CLIENT_SECRET 您的Spotify客户端密码
LOCAL_TOKEN 您的安全身份验证令牌
PORT 8000

保存并重新启动Web应用程序。


🤖 与Copilot Studio集成

步骤1:创建自定义连接器YAML

创建 spotify-mcp.yaml:

swagger: '2.0'
info:
  title: Spotify MCP
  description: MCP server for Spotify artist data
  version: 1.0.0
host: your-app-name.azurewebsites.net
basePath: /
schemes:
  - https
consumes:
  - application/json
produces:
  - application/json
paths:
  /mcp:
    post:
      summary: Invoke Spotify MCP Server
      x-ms-agentic-protocol: mcp-streamable-1.0
      operationId: InvokeSpotifyMCP
      responses:
        '200':
          description: Success
securityDefinitions:
  api_key:
    type: apiKey
    in: header
    name: Authorization
security:
  - api_key: []

步骤2:创建自定义连接器

  1. 首选 电源应用程序 → 自定义连接器
  2. 点击 +新的自定义连接器 → 导入OpenAPI文件
  3. 上传您的 spotify-mcp.yaml
  4. 命名它: Spotify MCP
  5. 在 安全 选项卡:
    • 身份验证类型: API密钥
    • 参数名称: Authorization
    • 参数位置: Header
  6. 点击 创建连接器

步骤3:添加到Copilot Studio

  1. 打开 Copilot工作室
  2. 创建或打开您的代理
  3. 首选 工具 → 添加工具 → 新工具 → 模型上下文协议
  4. 填写:
    • 服务器名称: Spotify MCP
    • 服务器描述: 检索Spotify艺术家信息、热门曲目和专辑
    • 服务器URL: https://your-app-name.azurewebsites.net/mcp
    • 身份验证: API密钥
  5. 与以下对象建立连接: Bearer your_LOCAL_TOKEN

步骤4:测试您的代理

尝试以下提示以测试所有不同的工具:

艺术家搜索:

  • “在Spotify上搜索Billie Eilish”
  • “找到艺术家德雷克”

曲目搜索:

  • “寻找the Weeknd的歌曲《Blinding Lights》”
  • “寻找Post Malone的足迹”

艺术家信息:

  • “跟我说说泰勒·斯威夫特——她创作了哪些流派?”
  • “爱莉安娜·格兰德有多少粉丝?”

热门曲目和专辑:

  • “获得泰勒·斯威夫特的热门歌曲”
  • “给我看看The Weeknd的专辑”

相关艺术家:

  • “查找与Billie Eilish相似的艺术家”
  • “像德雷克这样的艺术家是谁?”

音频分析:

  • “Blinding Lights的节奏和能量是多少?”(您需要曲目ID)
  • “分析曲目0VjIjW4GlUZAMYd2vXMi3b的音频特性”
  • “这条赛道既能跳舞又充满活力吗?”

详细信息:

  • “获取曲目ID 0VjIjW4GlUZAMYd2vXMi3b的完整详细信息”
  • “跟我说说《午夜》这张专辑”

💡 用例

借助11个强大的Spotify工具,您的Copilot可以处理复杂的音乐查询:

🎯 音乐探索

  • “查找与《Blinding Lights》类似的歌曲”
  • “像Billie Eilish这样的艺术家是谁?”
  • “搜索欢快的舞曲”

📊 音乐分析

  • “这条赛道的能量水平和节奏是多少?”
  • “比较三首不同歌曲的舞蹈性”
  • “这首歌是原声的还是电子的?”

🎤 艺术家研究

  • “告诉我泰勒·斯威夫特的流派和受欢迎程度”
  • “德雷克有多少追随者?”
  • “The Weeknd的前五首歌是什么?”

📀 专辑探索

  • “显示专辑《午夜》中的所有曲目”
  • “Ariana Grande发行了哪些专辑?”
  • “获取此相册的详细信息”

🎵 轨道发现

  • 寻找泰勒·斯威夫特的歌曲《反英雄》
  • “搜索标题中带有‘love’的曲目”
  • “获得这首歌的30秒预览”

🔗 推荐链

您的Copilot可以将多个工具链接在一起:

  1. 寻找艺术家→ 获取他们的热门曲目→ 分析其音频特性
  2. 查找相册→ 获取所有曲目→ 比较他们的能量水平
  3. 搜索艺术家→ 寻找相似的艺术家→ 获取他们的热门曲目

🛠️ 可用工具

1. search_artist_by_name

按名称在Spotify上搜索艺术家。

参数:

  • artist_name (string):要搜索的艺术家的名称

例子:

{
  "artist_name": "Taylor Swift"
}

退货: 最多5位匹配的艺术家及其Spotify ID、图像和流行度评分。


2. search_tracks

在Spotify上按姓名、艺术家或两者搜索曲目。

参数:

  • query (字符串):搜索查询(曲目名称、艺术家或组合)
  • limit (整数,可选):最大结果数(1-50,默认值:10)

例子:

{
  "query": "Blinding Lights The Weeknd",
  "limit": 5
}

退货: 使用姓名、艺术家、相册和预览URL跟踪搜索结果。


3. get_artist_top_tracks

获取Spotify艺术家的热门曲目。

参数:

  • artist_id (string):艺术家的Spotify ID

例子:

{
  "artist_id": "06HL4z0CvFAxyc27GXpf02"
}

退货: 艺术家最受欢迎的曲目列表。


4. get_artist_albums

为Spotify艺术家获取专辑。

参数:

  • artist_id (string):艺术家的Spotify ID

例子:

{
  "artist_id": "06HL4z0CvFAxyc27GXpf02"
}

退货: 包含发行日期和图片的专辑列表(最多10张)。


5. get_artist_info

获取有关Spotify艺术家的详细信息。

参数:

  • artist_id (string):艺术家的Spotify ID

例子:

{
  "artist_id": "06HL4z0CvFAxyc27GXpf02"
}

退货: 艺术家详细信息包括:

  • 类型
  • 人气评分(0-100)
  • 关注者数量
  • 艺术家图片
  • Spotify URL

6. get_related_artists

根据Spotify的推荐算法,获取与给定艺术家相似的艺术家。

参数:

  • artist_id (string):艺术家的Spotify ID

例子:

{
  "artist_id": "06HL4z0CvFAxyc27GXpf02"
}

退货: 最多20位类似艺术家的名单。


7. get_track_audio_features

获取曲目的音频分析功能(能量、可跳舞性、节奏等)。

参数:

  • track_id (string):曲目的Spotify ID

例子:

{
  "track_id": "0VjIjW4GlUZAMYd2vXMi3b"
}

退货: 音频功能包括:

  • 舞蹈性 (0.0-1.0):多适合跳舞啊
  • 能量 (0.0-1.0):强度和活动
  • 钥匙 (0-11):音乐键(0=C,1=C#等)
  • 响度 (dB):整体响度
  • 模式 (0-1):大(1)或小(0)
  • 哑口无言 (0.0-1.0):口语的存在
  • 声学 (0.0-1.0):声学与电学
  • 乐器 (0.0-1.0):声乐vs器乐
  • 活性 (0.0-1.0):现场观众在场
  • 价 (0.0-1.0):音乐的积极性/幸福感
  • 速度 (BPM):每分钟节拍数
  • 持续时间_ms:轨道长度(毫秒)

8. get_track_details

获取特定赛道的详细信息。

参数:

  • track_id (string):曲目的Spotify ID

例子:

{
  "track_id": "0VjIjW4GlUZAMYd2vXMi3b"
}

退货: 完整的轨道信息,包括:

  • 曲目名称
  • 艺术家
  • 专辑
  • 持续时间
  • 人气评分
  • 预览URL(30秒剪辑)
  • 显式内容标志
  • 可用市场

9. get_album_details

获取有关Spotify专辑的详细信息。

参数:

  • album_id (string):专辑的Spotify ID

例子:

{
  "album_id": "4yP0hdKOZPNshxUOjY0cZj"
}

退货: 专辑详细信息包括:

  • 专辑名称
  • 艺术家
  • 发布日期
  • 轨道总数
  • 完整曲目列表
  • 相册图片
  • 人气评分
  • 标签和版权信息

10. get_multiple_tracks_audio_features

一次获取多首曲目的音频功能(批量操作)。

参数:

  • track_ids (string):以逗号分隔的Spotify曲目ID列表(最多100个)

例子:

{
  "track_ids": "0VjIjW4GlUZAMYd2vXMi3b,4cOdK2wGLETKBW3PvgPWqT,3n3Ppam7vgaVa1iaRUc9Lp"
}

退货: 所有请求曲目的音频功能阵列,可用于比较多首歌曲。


11. get_artist_albums (增强)

使用过滤选项为Spotify艺术家获取专辑。

参数:

  • artist_id (string):艺术家的Spotify ID

例子:

{
  "artist_id": "06HL4z0CvFAxyc27GXpf02"
}

退货: 包含元数据的相册列表。


📁 项目结构

spotify-mcp/
├── .github/
│   └── workflows/
│       └── main_spotify-mcp1611.yml  # GitHub Actions deployment
├── server.py                          # Main MCP server
├── requirements.txt                   # Python dependencies
├── .env                               # Environment variables (local)
├── .gitignore                         # Git ignore rules
└── README.md                          # This file

🔒 安全

身份验证流程

  1. 客户端请求 → 包含 Authorization: Bearer <token> 头球
  2. 中间件检查 → 根据验证令牌 LOCAL_TOKEN
  3. 如果有效 → 请求继续到MCP服务器
  4. 如果无效 → 返回401未经授权

当前实施(开发/演示)

当前的实现使用了 简单的Bearer代币 认证适用于:

  • ✅ 开发和测试
  • ✅ 单租户部署
  • ✅ 公司内部使用,网络隔离
  • ✅ 概念验证演示

限制:

  • ❌ 所有用户的单一共享令牌
  • ❌ 没有用户特定的访问控制
  • ❌ 无令牌过期
  • ❌ 没有用户操作的审核日志记录

🔐 生产安全最佳实践

1. 实现OAuth 2.0/OpenID连接

对于生产,用适当的OAuth替换简单的Bearer令牌:

from fastmcp.server.auth import AzureOAuthProvider

# Use Azure Entra ID (recommended for Microsoft ecosystem)
auth = AzureOAuthProvider(
    tenant_id=os.getenv("AZURE_TENANT_ID"),
    client_id=os.getenv("AZURE_CLIENT_ID"),
    client_secret=os.getenv("AZURE_CLIENT_SECRET"),
    redirect_uri=os.getenv("OAUTH_REDIRECT_URI"),
    scopes=["openid", "profile", "email"]
)

mcp = FastMCP("spotify-mcp", auth=auth)

支持的身份提供程序:

  • Azure Entra ID(微软365)
  • Google 工作区
  • GitHub
  • 身份验证0
  • WorkOS
  • AWS Cognito

优点:

  • ✅ 用户特定身份验证
  • ✅ 自动令牌过期和刷新
  • ✅ 单点登录(SSO)支持
  • ✅ 每用户审计跟踪

2. 使用Azure密钥库获取秘密

切勿在生产环境变量中存储机密。

设置Azure密钥库:

from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient

# Connect to Key Vault
credential = DefaultAzureCredential()
vault_url = f"https://{os.getenv('KEY_VAULT_NAME')}.vault.azure.net"
client = SecretClient(vault_url=vault_url, credential=credential)

# Retrieve secrets
SPOTIFY_CLIENT_ID = client.get_secret("SpotifyClientId").value
SPOTIFY_CLIENT_SECRET = client.get_secret("SpotifyClientSecret").value

配置Azure Web应用程序:

  1. 启用 管理身份 在您的Web应用程序上
  2. 授予托管身份访问密钥库的权限
  3. 参考机密使用 @Microsoft.KeyVault(...) 语法

3. 实施速率限制

使用限速中间件防止滥用:

from fastmcp.server.middleware import RateLimitMiddleware

mcp.add_middleware(
    RateLimitMiddleware(
        max_requests=100,
        window_seconds=60,
        by_client_id=True  # Rate limit per client
    )
)

建议限值:

  • 发展: 每个客户端每分钟100个请求
  • 生产: 每个客户端每分钟1000个请求
  • 公共API: 每个IP地址每分钟60个请求

4. 添加请求日志和审计跟踪

跟踪API在安全和合规方面的所有使用情况:

from fastmcp.server.middleware import LoggingMiddleware
import logging

# Configure structured logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('audit.log'),
        logging.StreamHandler()
    ]
)

class AuditMiddleware(Middleware):
    async def on_call_tool(self, context: MiddlewareContext, call_next):
        user_id = context.request_context.user_id  # From OAuth
        tool_name = context.params.get("name")
        
        logger.info(f"User {user_id} called tool {tool_name}")
        
        result = await call_next(context)
        return result

mcp.add_middleware(AuditMiddleware())

登录Azure应用程序洞察:

from opencensus.ext.azure.log_exporter import AzureLogHandler

logger.addHandler(AzureLogHandler(
    connection_string=os.getenv("APPLICATIONINSIGHTS_CONNECTION_STRING")
))

5. 实现基于角色的访问控制(RBAC)

控制哪些用户可以访问哪些工具:

from fastmcp.server.middleware import Middleware

class RBACMiddleware(Middleware):
    ADMIN_TOOLS = {"get_multiple_tracks_audio_features"}
    
    async def on_call_tool(self, context: MiddlewareContext, call_next):
        user_roles = context.request_context.user_roles  # From OAuth token
        tool_name = context.params.get("name")
        
        # Restrict admin-only tools
        if tool_name in self.ADMIN_TOOLS and "admin" not in user_roles:
            return ToolResult(
                content=[{"type": "text", "text": "Unauthorized: Admin access required"}]
            )
        
        return await call_next(context)

mcp.add_middleware(RBACMiddleware())

6. 启用Azure Web应用程序身份验证

使用Azure的内置身份验证(EasyAuth):

在Azure门户中:

  1. 转到您的Web应用程序→ 认证
  2. 点击 添加身份提供者
  3. 选择 微软 (或其他供应商)
  4. 配置:
    • 限制访问: 需要身份验证
    • 未经身份验证的请求: HTTP 401
    • 令牌存储: 启用

优点:

  • ✅ 无需更改代码
  • ✅ 在平台级别处理身份验证
  • ✅ 适用于Copilot Studio的OAuth流程
  • ✅ 自动令牌验证

7. 使用基于环境的配置

单独的dev/stating/prod配置:

import os

ENV = os.getenv("ENVIRONMENT", "development")

if ENV == "production":
    # Strict security settings
    REQUIRE_HTTPS = True
    MASK_ERROR_DETAILS = True
    ENABLE_RATE_LIMITING = True
    LOG_LEVEL = "WARNING"
elif ENV == "staging":
    REQUIRE_HTTPS = True
    MASK_ERROR_DETAILS = True
    ENABLE_RATE_LIMITING = False
    LOG_LEVEL = "INFO"
else:  # development
    REQUIRE_HTTPS = False
    MASK_ERROR_DETAILS = False
    ENABLE_RATE_LIMITING = False
    LOG_LEVEL = "DEBUG"

mcp = FastMCP(
    "spotify-mcp",
    mask_error_details=MASK_ERROR_DETAILS
)

8. Spotify API安全证书

最佳实践:根据环境使用服务主体

  1. 为开发/暂存/生产创建单独的Spotify应用程序
  2. 定期轮换凭证(每90天一次)
  3. 监视异常的API使用模式

实施令牌轮换:

import time
from threading import Lock

class SpotifyTokenManager:
    def __init__(self):
        self.token = None
        self.expiry = 0
        self.lock = Lock()
    
    def get_token(self) -> str:
        with self.lock:
            if time.time() >= self.expiry:
                self.refresh_token()
            return self.token
    
    def refresh_token(self):
        # Get new token from Spotify
        resp = requests.post(...)
        self.token = resp.json()["access_token"]
        self.expiry = time.time() + resp.json()["expires_in"] - 60

token_manager = SpotifyTokenManager()

9. 正确启用CORS

只允许生产中的特定来源:

from starlette.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=[
        "https://copilotstudio.microsoft.com",
        "https://your-company-domain.com"
    ],  # Never use ["*"] in production
    allow_credentials=True,
    allow_methods=["POST"],
    allow_headers=["Authorization", "Content-Type"],
)

10. 实施健康检查和监测

为Azure监控添加运行状况终结点:

@mcp.custom_route("/health", methods=["GET"])
async def health_check():
    # Check Spotify API connectivity
    token = get_spotify_token()
    if not token:
        return JSONResponse(
            status_code=503,
            content={"status": "unhealthy", "reason": "Cannot authenticate with Spotify"}
        )
    
    return JSONResponse(
        content={
            "status": "healthy",
            "version": "2.0.0",
            "tools_count": 11
        }
    )

在Azure中配置:

  • 设置健康检查路径: /health
  • 启用 应用洞察
  • 设置 警报 对于失败

11. 数据隐私和合规

GDPR合规性:

  • 仅记录必要的用户信息
  • 实施数据保留策略
  • 提供用户数据导出/删除

审核日志清理示例:

import datetime

def cleanup_old_logs():
    """Delete logs older than 90 days (GDPR requirement)"""
    retention_days = 90
    cutoff_date = datetime.datetime.now() - datetime.timedelta(days=retention_days)
    # Delete logs older than cutoff_date

🛡️ 生产安全检查表

上线前:

  • []用OAuth 2.0替换简单的Bearer令牌
  • []将所有机密移动到Azure密钥库
  • []启用Azure Web应用程序托管身份
  • []配置Azure Web应用程序身份验证(EasyAuth)
  • []实施限速(100-1000要求/分钟)
  • []使用Application Insights添加审计日志记录
  • []为敏感工具设置RBAC
  • []仅启用特定来源的CORS
  • []添加健康检查端点
  • []配置故障警报
  • []测试令牌过期和刷新
  • []实现错误屏蔽(mask_error_details=True)
  • []为每个环境设置单独的Spotify应用程序
  • []仅启用HTTPS(禁用HTTP)
  • []配置Web App防火墙规则
  • []设置Azure Monitor仪表板
  • []记录事件响应程序
  • []执行安全渗透测试
  • []如果处理PHI/PII,请审查并签署BAA

📋 合规注意事项

数据处理

  • Spotify数据: 受Spotify服务条款约束
  • 用户数据: 可能需要遵守GDPR/CCPA
  • 审核日志: 保留以符合要求(通常为90天至7年)

推荐政策

  1. 数据保留政策 -日志和缓存数据保留多长时间
  2. 事件响应计划 -如果发生安全漏洞怎么办
  3. 访问控制策略 -谁可以访问哪些工具
  4. API使用策略 -费率限制和可接受的使用

🔗 安全资源


最佳实践总结

✅ 发展: 简单承载令牌(当前实现)
✅ 分期: OAuth+密钥库+速率限制
✅ 生产: OAuth+密钥库+速率限制+RBAC+审计日志+监控


🧪 测试

卷曲测试

# Initialize session
curl -X POST https://your-app-name.azurewebsites.net/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "Authorization: Bearer your_token" \
  -d '{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}},"id":1}'

Copilot Studio中的测试

  1. 打开你的代理 测试 窗格
  2. 问:“在Spotify上搜索德雷克”
  3. 检查Azure日志以了解:
    ✅ Token validation successful
    INFO:mcp.server.lowlevel.server:Processing request of type CallToolRequest
    

📊 监控

查看Azure日志

az webapp log tail --name your-app-name --resource-group your-rg

或者在Azure门户中:

  1. 转到您的Web应用程序
  2. 监控 → 日志流

预期日志输出

🎵 Spotify MCP Server starting...
   Port: 8000
   Endpoint: /mcp
   Authentication: Bearer token required
   Available Tools: 11
INFO:     Started server process
INFO:     Uvicorn running on http://0.0.0.0:8000

当请求进来时:

✅ Token validation successful
INFO:mcp.server.lowlevel.server:Processing request of type CallToolRequest

🐛 故障排除

问题:“未经授权”错误

原因: Bearer令牌丢失或无效

解决方案:

  1. 检查你的 LOCAL_TOKEN 在Azure配置中
  2. 验证Copilot Studio中的连接是否使用: Bearer your_token
  3. 确保令牌中没有多余的空格

问题:“Spotify身份验证失败”

原因: Spotify凭据无效

解决方案:

  1. 验证 SPOTIFY_CLIENT_ID 和 SPOTIFY_CLIENT_SECRET 在Azure中
  2. 检查凭据 Spotify仪表板
  3. 更新后重新启动Azure Web应用程序

问题:Copilot Studio中未显示工具

原因: MCP服务器未正确连接

解决方案:

  1. 验证服务器URL是否正确
  2. 带有卷曲的测试终点
  3. 检查Azure日志是否有错误
  4. 在Copilot Studio中重建连接

🎼 Spotify API使用的功能

此MCP服务器利用以下Spotify Web API端点:

端点 工具 速率限制
/search search_artist_by_name, search_tracks 标准
/artists/{id} get_artist_info 标准
/artists/{id}/top-tracks get_artist_top_tracks 标准
/artists/{id}/albums get_artist_albums 标准
/artists/{id}/related-artists get_related_artists 标准
/tracks/{id} get_track_details 标准
/albums/{id} get_album_details 标准
/audio-features/{id} get_track_audio_features 标准
/audio-features?ids= get_multiple_tracks_audio_features 标准

注: 所有端点都使用客户端凭据流,不需要用户身份验证。


🔄 API费率限制

  • Spotify API: 费率限制适用于每个客户ID
  • 建议: 对频繁请求的数据实施缓存
  • 最佳实践: 使用批处理端点(如 get_multiple_tracks_audio_features)如果可能的话

📚 资源


🤝 贡献

欢迎投稿!拜托:

  1. 分叉存储库
  2. 创建要素分支(git checkout -b feature/amazing-feature)
  3. 提交您的更改(git commit -m 'Add amazing feature')
  4. 推到分支(git push origin feature/amazing-feature)
  5. 打开拉取请求

👤 作者

Ivy Fiecas Borjal


🙏 致谢


📺 教程

该项目基于以下概念构建: