Skip to main content

A Python Client Application that allows interaction with the Microsoft Graph API.

Project description

ms-graph

PyPI version Python Versions License: MIT

A Python client for the Microsoft Graph API, covering OneDrive, SharePoint, Outlook Mail, OneNote, Contacts, Excel Workbooks, Users, Groups, and Search.


Installation

pip install ms-graph

Or with Poetry:

poetry add ms-graph

Prerequisites

Register an application in the Azure Portal to obtain:

  • Client ID
  • Client Secret
  • Redirect URI

Grant the required Microsoft Graph API permissions for the services you intend to use.


Quick Start

from ms_graph import MicrosoftGraphClient

client = MicrosoftGraphClient(
    client_id="YOUR_CLIENT_ID",
    client_secret="YOUR_CLIENT_SECRET",
    redirect_uri="YOUR_REDIRECT_URI",
    scope=["Files.Read", "Files.ReadWrite", "Mail.Read"],
    account_type="consumers",  # or "organizations" / "common"
)

# Opens a browser prompt on first run to complete OAuth2 flow.
# Subsequent runs use a saved token / refresh token automatically.
client.login()

Credentials are persisted to a local JSON file (or Azure Key Vault — see below). On subsequent runs, tokens are refreshed silently.


Services

OneDrive — Drives

drives = client.drives()

# Root drive
root = drives.get_root_drive()

# Children of root
children = drives.get_root_drive_children()

# Recent files
recent = drives.get_recent_files()

# Shared with me
shared = drives.get_shared_files()

OneDrive — Drive Items

items = client.drive_item()

# By item ID
item = items.get_drive_item(drive_id="DRIVE_ID", item_id="ITEM_ID")

# By path
item = items.get_drive_item_by_path(drive_id="DRIVE_ID", item_path="Documents/report.xlsx")

# Group drive item
item = items.get_group_drive_item(group_id="GROUP_ID", item_id="ITEM_ID")

Outlook Mail

mail = client.mail()

# List messages for signed-in user
messages = mail.list_my_messages()

# List messages for a specific user
messages = mail.list_user_messages(user_id="user@example.com")

# Get a specific message
msg = mail.get_my_messages(message_id="MESSAGE_ID")

# Create a draft
draft = mail.create_my_message(message={
    "subject": "Hello",
    "body": {"contentType": "Text", "content": "Hi there"},
    "toRecipients": [{"emailAddress": {"address": "recipient@example.com"}}]
})

OneNote

notes = client.notes()

# My notebooks
notebooks = notes.list_my_notebooks()

# Notebooks for a specific user
notebooks = notes.list_user_notebooks(user_id="user@example.com")

# Notebooks for a group
notebooks = notes.list_group_notebooks(group_id="GROUP_ID")

Personal Contacts

contacts = client.personal_contacts()

# All contacts
all_contacts = contacts.list_my_contacts()

# Contact folders
folders = contacts.list_my_contacts_folder()

# Folder by ID
folder = contacts.list_contacts_folder_by_id(user_id="USER_ID", folder_id="FOLDER_ID")

Users

users = client.users()

all_users = users.list_users()

Groups

groups = client.groups()

all_groups = groups.list_groups()

Search

search = client.search()

results = search.query(search_request={
    "requests": [{
        "entityTypes": ["driveItem"],
        "query": {"queryString": "quarterly report"}
    }]
})

Excel Workbooks

workbooks = client.workbooks()

# Create a session (enables batching edits)
session = workbooks.create_session(item_path="Documents/report.xlsx")
session_id = session["id"]

# Refresh the session
workbooks.refresh_session(session_id=session_id, item_path="Documents/report.xlsx")

# Close the session
workbooks.close_session(session_id=session_id, item_path="Documents/report.xlsx")

Excel Worksheets

from ms_graph.workbooks_and_charts import Worksheet

worksheet = Worksheet(session=client.graph_session)

# Add a new sheet
worksheet.add_worksheet(item_path="Documents/report.xlsx", name="Summary")

Excel Range

range_svc = client.range()

# Get a range by address
data = range_svc.get_range(
    item_path="Documents/report.xlsx",
    worksheet_name_or_id="Sheet1",
    address="A1:C5"
)

Excel Tables

table_svc = client.table()

Credential Storage Options

Option 1 — JSON file (default)

Pass a file path as credentials. The token is saved/loaded automatically:

client = MicrosoftGraphClient(
    client_id="...",
    client_secret="...",
    redirect_uri="...",
    scope=[...],
    credentials="./ms_graph_state.json",
)

Option 2 — Azure Key Vault

Pass an Az client from azkees and set the env var key_msgraph_credentials_state to the Key Vault secret name where the token JSON will be stored:

import os
from azkees import Az
from ms_graph import MicrosoftGraphClient

os.environ["key_msgraph_credentials_state"] = "msgraphstate"

az_client = Az(config_section="production", keys_config_path="/app/config/api_keys.ini")

client = MicrosoftGraphClient(
    client_id="...",
    client_secret="...",
    redirect_uri="...",
    scope=[...],
    az_client=az_client,
)

Enums

from ms_graph.workbooks_and_charts.enums import (
    CalculationTypes,
    WorksheetVisibility,
    RangeShift,
    Underline,
)

CalculationTypes.RECALCULATE.value   # "Recalculate"
WorksheetVisibility.HIDDEN.value     # "Hidden"
RangeShift.DOWN.value                # "Down"

Changelog

See CHANGELOG.md for version history.

License

MIT

Author

Bharani Nitturi

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ms_graph-1.6.2.tar.gz (28.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ms_graph-1.6.2-py3-none-any.whl (37.2 kB view details)

Uploaded Python 3

File details

Details for the file ms_graph-1.6.2.tar.gz.

File metadata

  • Download URL: ms_graph-1.6.2.tar.gz
  • Upload date:
  • Size: 28.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ms_graph-1.6.2.tar.gz
Algorithm Hash digest
SHA256 1c733be45e7adab4ab78a0cbf0eced0c5e34ad7d26ead4f6da401d990a05ce72
MD5 4e63b72cf820f2b7fe0dcdfacecf5539
BLAKE2b-256 4d4f8974d5a2a62e5e0549839b6c63c855d8cb51a6563015ef20f1f389ba5e82

See more details on using hashes here.

File details

Details for the file ms_graph-1.6.2-py3-none-any.whl.

File metadata

  • Download URL: ms_graph-1.6.2-py3-none-any.whl
  • Upload date:
  • Size: 37.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ms_graph-1.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 653bc92229e4bfbf3c001fd51021c5128b1df89d44f14eb68595982cf00a6a02
MD5 47952f15b1a0386e9e65fd30f3ddde51
BLAKE2b-256 6eb4b186a076fac1fc598168937a0cb39251af4d0fec7f0cb5a6e7f0c34e297b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page